Как заменить встречаемость слова в диапазонах, указанных с помощью sed команду?

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."
1
задан 1 February 2015 в 10:15

2 ответа

Я не уверен, умно ли это или не, но здесь является моим 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 и 8 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) || (...) )
2
ответ дан 3 December 2019 в 07:03

Иначе с помощью расширения фигурной скобки, можно сделать:

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

2
ответ дан 3 December 2019 в 07:03

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

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