2012-05-22 2 views
0

У меня есть строка, позволяет сказать:UNIX: Использование sed для устранения и замены вещей в строке?

<lic><ic>This is a string</ic>, welcome to my blog.</lic> 

Я хочу использовать СЭД, чтобы избавиться от <ic> и </ic> тегов, а также буквальное теги <lic> и </lic>

Какой самый быстрый способ сделать это? Я очень новичок в sed. Как это сделать в awk? Я знаю, что awk намного лучше подходит для текста в виде столбца, поэтому я больше склонен научиться использовать sed.

Любая помощь всегда приветствуется, спасибо заранее!

+0

_Just_ этих тегов? Нет других? – paxdiablo

+1

Вы не хотите использовать sed для разбора xml: http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454 –

ответ

3
sed -e 's%</\{0,1\}l\{0,1\}ic>%%g' 

\{0,1\} является стандартом sed способом написания эквивалента ? в PCRE. Регулярное выражение использует % для разделения бит; затем ищет <, возможно, за ним следует косая черта, за которой следует l, а затем ic> и заменяет его ничем, глобально через каждую строку ввода.

В некоторых версиях sed вы можете указать альтернативные системы регулярных выражений, но это работает везде.

+0

Большое спасибо! Это сработало с первой попытки! Вы случайно знаете, как это будет сделано с помощью awk? –

+0

Я уверен, что это можно сделать с помощью 'awk'; Я бы не использовал 'awk' для этой работы. Я бы использовал Perl, где это было бы «тривиально»: 'perl -pe 's% %% g''. Также доступна перезагрузка файлов с резервной копией. С 'gawk' функция будет' gsub': 'awk '{gsub (/ <\/?l?ic> /,' ', $ 0); печать;} ' '. Неиспользованный код. –

+0

Как вы уже сказали, некоторые версии 'sed' поддерживают дополнительные функции регулярных выражений. По крайней мере, в GNU 'sed',' \? 'Работает (или с' -r': '?'). –

3

Удалить только теги:

sed -i.old -r 's;</?l?ic>;;g' infile 
+0

+1 для большинства краткий ответ. 'sed 's | || g 'infile' тоже будет работать, или если вы предпочитаете 'sed' s | || g'' в крайнем случае. – potong

+0

Спасибо за ответ! –

1

Ваши теги имеют структуру левого кронштейна следует ряд символов, которые не правая скобка, а затем, наконец, правая скобка. Так давайте писать это таким образом:

sed 's/<[^>]*>//g' 
+0

Спасибо за ответ! –

2

sed не должен быть сложным. Вот два простых способа сделать то, что вы хотите.

Это соответствует именно этим моделям и удаляет их по всему миру:

sed -e "s%\(<lic>\|</lic>\|<ic>\|</ic>\)%%g" file.txt

Помните, что вы можете установить несколько выражений с помощью sed при необходимости:

sed -e "s%<lic>%%" -e "s%</lic>%%" -e "s%<ic>%%" -e "s%</ic>%%" file.txt

+0

Кроме того, если вы меняете '-e' на' -i', вы можете напрямую записывать эти изменения в 'file.txt'. – Steve

+1

Альтернативой является 'sed 's% <\ (/ l \ |/\ | l \ | \) ic> %% g' file.txt' – potong

+0

Спасибо за ответ! –