Выход sed представляет в виде строки правильно

У меня есть regex и заменяющий шаблон, которые были и протестированы в Блокноте ++ на моих входных данных и работе правильно. Когда я поместил их в sed выражение, однако, ничто не подобрано.

Вот команда 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)

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

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

Как я могу добраться, это вышло правильно?

10
задан Chris Lieb 16 January 2010 в 00:36
поделиться

5 ответов

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

sed -r 's/([a-zA-Z0-9.]+) [0-9] (.*)/\2 (\1)/g' file1.txt
17
ответ дан 3 December 2019 в 14:34
поделиться

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

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

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

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

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

9
ответ дан 3 December 2019 в 14:34
поделиться

Знак плюс необходимо сбежать, когда не используете коммутатор -R .

4
ответ дан 3 December 2019 в 14:34
поделиться
$ sed -e 's/\([a-zA-Z0-9.].*\) [0-9] \(.*\)/\2 \(\1\)/g' file
Doe, John (jdoe)
Doe, Jane (jad)
Smith, Jon (smith)
1
ответ дан 3 December 2019 в 14:34
поделиться
[11368756-

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

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

Выход:

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

См. Человек awk 1

2
ответ дан 3 December 2019 в 14:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: