str="I want to abc replace a word abc in a sentence abc of file abc by giving abc specifying a abc multiple abc range to abc the sed abc command abc."
Вышеупомянутая ул. жала имеет слово "abc", 10 раз произошел, я хочу заменить "abc", произошедшую с 2-го - 4-го раза и 6-ю - 8-ю со словом "xyz" использующий sed команда.
после sed команда на строковой ул., ул. должна посмотреть как указано ниже:
str="I want to abc replace a word xyz in a sentence xyz of file xyz by giving abc specifying a xyz multiple xyz range to xyz the sed abc command abc."
Я не уверен, умно ли это или не, но здесь является моим GNU sed решение:
sed 's/abc/nonABC/5;s/abc/nonABC/8g;s/abc/xyz/2g;s/nonABC/abc/g' <<<"$str"
sed '
s/abc/nonABC/5; # replace only 5th occurrence of 'abc' word with another word (i, e: 'nonABC')
s/abc/nonABC/8g; # replace 8th to the next occurrences of 'abc' with another word too
s/abc/xyz/2g; # replace all occurrences of 'abc' word start from 2th place
s/nonABC/abc/g # get back the all changed 'abc' from 'nonABC'
' <<<"$str" # from 'str' as input
И с awk
и конечно умный:
awk '{printf ( 2<=NR && NR<=8 && NR!=5 )?$0"xyz":$0RS}' RS='abc' <<<"$str"
RS='abc'
определяет 'abc' как Разделитель записей2<=NR && NR<=8
но не равняются с 5 NR!=5
, затем распечатайте текущую запись $0
и слово замены xyz
, иначе распечатайте запись и abc
самостоятельно. можно использовать $0"abc"
вместо $0RS.
Если Ваши диапазоны похожи: [(2-4), (8-10), (12-15), (18-20), (26-29)...], поскольку Вы упомянули в комментарии затем awk
лучшая команда для этого задания. Только Вам нужно, указывает диапазоны, поскольку несколько обусловливают:
( (2<=NR && NR<=4) || (8<=NR && NR<=10) || (12<=NR && NR<=15) || (18<=NR && NR<=20) || (26<=NR && NR<=29) || (...) )
Иначе с помощью расширения фигурной скобки, можно сделать:
sed '-es/abc/xyz/'{8..6} '-es/abc/xyz/'{4..2} <<<"$str"
Обратите внимание на то, что диапазон должен всегда быть max
сначала в {max#..min#}
даже сначала макс. диапазоны должны быть, указывают сначала.
Можно также указать, в котором должен заменить диапазон положений {x,y,z}
формат, где числа должны быть x>y>z
:
sed '-es/abc/xyz/'{8,6,4,2} <<<"$str"
Обратите внимание на это при использовании того же числа {x,x}
это вызовет проблему и заменит положение x
снова и снова (BTW для этого существует s/abc/xyz/X
альтернатива, где X
число положения).
Я узнал об этом с из ответа Stéphane Chazelas на Unix. SE