Есть ли способ сказать, sed
чтобы заменить шаблон в каждом втором случае? Или хотя бы на каждой второй строке? (Конечно, это возможно с помощью сценария, но я спрашивал себя, sed
можно ли это сделать).
редактировать
я нашел
sed -e "s/pattern/replacement/g;n"
Но он заменял каждый первый случай, а не второй.
пример
Входной файл:
I have a pattern in each line
Also the second line has the pattern
Another pattern here
And -- you guess it -- a pattern
Желаемый вывод:
I have a pattern in each line
Also the second line has the replacement
Another pattern here
And -- you guess it -- a replacement
sed -e 'n;s/2004-2009/6e législature/g'
которая решила мою проблему.Заменит второе вхождение в каждой строке, имеющей шаблон.
если у вас есть GNU
sed
:Начиная с первой строки
1
, строка после нее будет добавлена в пространство шаблона,N
после чегоs
команда заменит второе вхождение шаблона. затемsed
переместится на две строки вниз~2
и повторите.источник
code
(sed '1 ~ 2s / pattern /Простая интерпретация:
В первой строке, которая содержит хотя бы одно вхождение PATTERN, вы хотите проигнорировать его и вывести строку как есть. Во второй строке, которая содержит хотя бы одно вхождение PATTERN, вы хотите заменить первый экземпляр PATTERN на REPLACEMENT. В третьей строке, которая содержит хотя бы одно вхождение PATTERN, вы хотите напечатать строку как есть. В четвертой строке, содержащей хотя бы одно вхождение PATTERN, вы хотите заменить первый экземпляр PATTERN на REPLACEMENT. И так далее. Строки, которые не соответствуют шаблону, должны быть напечатаны без изменений.
Это можно легко сделать с помощью Sed следующим образом:
Или с меньшим количеством пробелов и более короткой меткой:
РЕДАКТИРОВАТЬ: Я просто перечитал вопрос и заметил более сложную интерпретацию:
Замените второе вхождение PATTERN во всем документе на REPLACEMENT, независимо от того, встречается ли оно в той же строке, что и первое вхождение, или нет. Оставьте первое и третье вхождения без изменений. И т.п.
Я полагаю, что это может быть сделано и с Sed, хотя это НАМНОГО сложнее, и я полагаю, что это зависит от используемого регулярного выражения. Я постараюсь что-то придумать и опубликовать, но пока оставлю этот ответ в простой версии выше.
источник
t
est наq
uit и примите входные данные, как{ sed '...'; cat; } <input
только для одной заменыВы были очень близки, просто пропустите первую строку:
Почему должен
awk
быть лучший инструмент в этом случае?источник
Один символ в одной строке: sed 's / (a [^ a] *) a / \ 1c / g'
Каждый второй шаблон (может появиться только одно совпадение с шаблоном на строку. Если появятся два или более совпадений на одну строку, будет заменен только второй)
источник