2010-01-16 5 views
10

У меня есть шаблон регулярного выражения и замены, которые были протестированы в Notepad ++ на моих входных данных и работают правильно. Однако, когда я помещаю их в выражение sed, ничего не получается.Правильно выполнив правильные строки

Вот СЭД команды:

# SEARCH = ([a-zA-Z0-9.]+) [0-9] (.*) 
# REPLACE = \2 (\1) 

sed -e 's/\([a-zA-Z0-9.]+\) [0-9] \(.*\)/\2 \(\1\)/g' 

Вот выборка данных:

jdoe 1 Doe, John 
jad 1 Doe, Jane 
smith 2 Smith, Jon 

и желаемый выход:

Doe, John (jdoe) 
Doe, Jane (jad) 
Smith, Jon (smith) 

Я попытался удаление и добавление ускользает к различным символам в выражении sed, но либо не получает ничего согласованного, либо что-то вроде строк:

sed: -e expression #1, char 42: invalid reference \2 on `s' command's RHS 

Как это избежать?

ответ

17

я обычно проще использовать ключ -r, так как это означает, что побег похож на большинство других языков:

sed -r 's/([a-zA-Z0-9.]+) [0-9] (.*)/\2 (\1)/g' file1.txt 
+0

Это работало красиво. Благодарю. –

4

Знак плюс должен быть экранированы, когда не с помощью переключателя -r.

9

Несколько предупреждений и дополнения, что все остальные уже сказали:

  1. Опция -r является расширением GNU, чтобы включить расширенные регулярные выражения. Вместо BSD используется sed -E.
  2. Sed и Grep использование Basic Regular Expressions
  3. Awk использует Extended Regular Expressions
  4. Вы должны стать удобными с POSIX specifications, такие как IEEE Std 1003.1, если вы хотите писать переносимые сценарии, мейкфайлы и т.д.

Я бы рекомендовал переписав в качестве

's/\([a-zA-Z0-9.]\{1,\}\) [0-9] \(.*\)/\2 (\1)/g' 

, который должен делать именно то, что вы хотите, в любом совместимом с POSIX sed. Если вы действительно заботитесь о таких вещах, подумайте об определении переменной среды POSIXLY_CORRECT.

1
$ sed -e 's/\([a-zA-Z0-9.].*\) [0-9] \(.*\)/\2 \(\1\)/g' file 
Doe, John (jdoe) 
Doe, Jane (jad) 
Smith, Jon (smith) 
2

Использование AWK гораздо проще ...:

cat test.txt | awk '{ print $3 " " $4 " " "("$1")" }' 

Выход:

Doe, John (jdoe) 
Doe, Jane (jad) 
Smith, Jon (smith) 

См человек AWK 1

 Смежные вопросы

  • Нет связанных вопросов^_^