sed: Замените слово A на B из строки 3 до последней строки только в строке, содержащей слово C

#sed

Вопрос:

Ожидаемый Вклад

 A B C
C A B
C C A
C A A
A A B
 

Ожидаемый Результат

 A B C
C A B
C C B
C B B
A A B
 

Выход

 B B C
C B B
C C B
C B B
A A B
 

Я пытаюсь заставить эту команду работать, но она не работает.

 # '/C/s/A/B' file > newfile
sed '3,$ /C/s/A/B' file > newfile
 

Ответ №1:

Вы сможете использовать { ...; } для группировки команд sed для диапазонов строк, которые вы хотите, и поставить ; «перед } «, поэтому убедитесь, что sed BSD/POSIX может работать с этим.

Вы можете использовать это sed :

 sed '3,$ { /C/ s/A/B/g; }' file > newfile

cat > newfile


A B C
C A B
C C B
C B B
A A B
 

Комментарии:

1. @SaadShamim: Это сработало?

Ответ №2:

С показанными вами образцами, пожалуйста, попробуйте выполнить следующий awk код. Простым объяснением было бы проверить условие, если номер строки больше 3 или равен 3, А строка содержит C, затем глобально заменить все вхождения A на B и распечатать отредактированные/не отредактированные строки.

 awk 'FNR>=3 amp;amp; /C/{gsub(/A/,"B")} 1' Input_file
 

Ответ №3:

Это может сработать для вас (GNU sed):

 sed '3,$!b;/C/y/A/B/' file
 

Если номер строки не находится между 3 и концом файла, спасайтесь.

В противном случае для строк, содержащих C , переведите A » s » в B «s».

N. B. Если A » s » и B » s » — истинные слова, используйте s/A/B/g .