Как я могу сделать & ldquo; sed & rdquo; будьте конкретны при поиске фразы

Я использую «sed» для поиска и удаления фразы в текстовом файле. Это прекрасно работает, но я не могу сделать это конкретным. Например, это моя команда "sed":

sed -i 's/foobox.com//' ~/Foo/fooman.txt

Я ищу 6 конкретных фраз в ~ / Foo / fooman.txt

:

dl-web.foobox.com
dl.foobox.com
foobox.com
fooboxdownloads.com
www.foobox.com
www.fooboxdownloads.com

Когда я запускаю sed -i 's/foobox.com//' ~/Foo/fooman.txt, он находит каждую запись с "foobox.com" и удаляет ее, но оставляет там левые (т. Е. "Dl-web." "Dl." "Downloads.com" "www." «www.downloads.com».

Можно ли заставить «sed» использовать «подстановочный знак» при поиске фразы? не работает). Если не используется подстановочный знак, может ли «sed» использовать какой-то другой метод для получения конкретного (dl-web.foobox.com), а не просто быть общим (foobox.com)? id «sed» не может сделать Хитрость, есть ли другая команда CI, которая бы справилась?

Спасибо за любую помощь, я новичок в Linux и пишу команды CI.

1
задан 21 May 2012 в 19:56

3 ответа

[[:alnum:].-] будет соответствовать буквенному или числовому символу или . или -. Поставьте * после него, и оно будет соответствовать нулю или более (жадно). Это должно охватывать возможные символы в имени хоста. Также обратите внимание, что . соответствует любому символу, поэтому, если вы хотите соответствовать только ., вам нужно экранировать его с помощью \ или заключить в [ и ] (то есть: \. ] или [.]). Итак:

sed -i 's/[[:alnum:].-]*foobox\.com[[:alnum:].-]*//g' file

может быть тем, что вы хотите. Обратите внимание, что нестандартная опция -i в GNU и BSD sed не редактирует файлы, она заменяет файлы. Это может не иметь значения в вашем случае, просто имейте в виду, что если какой-либо из файлов является ссылками, эти ссылки будут нарушены. Если это имеет значение, подумайте об использовании командного редактора файлов, например ed или ex.

См. http://xrl.us/sedintro#uh-0 для хорошего введения в sed.

0
ответ дан 21 May 2012 в 19:56

это зависит от того, как строки разграничены.

Скажем, вы ограничены пробелами, тогда что-то вроде этого может помочь:

sed 's/ .*foobox.*\.com / /g'

«g» будет гарантировать, что если есть больше чем одно совпадение в строке, все совпадения будут заменены

, проверено с помощью

DEF  dl-web.foobox.com XYZ
DEF dl.foobox.com XYZ
DEF  foobox.com XYZ
DEF  fooboxdownloads.com XYZ
DEF  www.foobox.com XYZ
DEF  www.fooboxdownloads.com XYZ 

с получением

DEF XYZ
DEF XYZ
DEF XYZ
DEF XYZ
DEF XYZ
DEF XYZ 
0
ответ дан 21 May 2012 в 19:56

Не могли бы вы использовать вместо этого grep? Команда

cat ~/Foo/fooman.txt | grep -v foobox.com

удалит все строки, содержащие фразу foobox.com. Это то, что вы хотели сделать?

0
ответ дан 21 May 2012 в 19:56

Другие вопросы по тегам:

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