Sed wildcards - заменить в середине определенных символов - PullRequest
3 голосов
/ 13 февраля 2012

У меня есть такая строка

"RU_28" "CDM_279" "CDI_45"
"RU_567" "CDM_528" "CDI_10000"

Я хочу получить результат ниже

"RU_28" "CDM_Unusued" "CDI_45"
"RU_567" "CDM_Unusued" "CDI_10000"

Сделайте это для всех строк в файле

Я использую следующие команды:

sed 's/\"CDM_\w*\"/\"Unusued\"/g' File1.txt > File2.txt

Кажется, это не работает.

Заранее спасибо !!!

Ответы [ 2 ]

2 голосов
/ 13 февраля 2012

Вы можете использовать:

sed -i.bak 's/"\(CDM_\)[^"]*"/"\1Unused"/' file1.txt
1 голос
/ 13 февраля 2012

Вы на самом деле не оставляете "CDM_" на правой стороне. Ваша замена говорит: «Замените CDM_ и любое количество слов на Unusued». Обычный способ сделать то, что вы действительно хотите сделать, это использовать круглые скобки вокруг раздела слева, который вы хотите сохранить, а затем использовать обратные ссылки, чтобы указать, куда они идут справа. В этом случае вам просто нужна одна обратная ссылка, обозначенная \1:

sed 's/"\(CDM_\)\w*"/"\1Unusued"/g' File1.txt > File2.txt

Обратите внимание на обратную косую черту перед скобками с левой стороны; их можно опустить, если использовать sed с -r (я думаю) для расширенных регулярных выражений, но как есть, они необходимы, чтобы sed знал, что они не буквальные.

Редактировать: Я обновил команду в ответ на точный комментарий Бирей, отметив, что посторонние экранируются для двойных кавычек. (Обратите внимание, что скобки по-прежнему необходимы).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...