Как использовать вывод grep для sed и изменить слово, чтобы изменить часть исходного текстового файла - PullRequest
0 голосов
/ 09 апреля 2020

Часть моего текстового файла говорит:

callingNumber: xxxxxxx 
irrelevantnumberinfo: xxxxxxx
irrelevantnumberinfo2: xxxxxxx 
number: 12345678

Я хочу, чтобы часть моего исходного текстового файла выглядела так:

callingNumber: xxxxxxx 
irrelevantnumbeRinfo: xxxxxxx
irrelevantnumbeRinfo2: xxxxxxx 
numbeR: 12345678

Я пробовал cat test.txt | grep -A3 callingNumber | sed -i 's/number/numbeR/g' но он постоянно говорит мне, что для sed нет входного файла.

Обратите внимание, что в исходном текстовом файле содержится больше слов "число", и я хочу изменить только эту конкретную часть.

Ответы [ 2 ]

1 голос
/ 09 апреля 2020

Вы можете сделать это только с sed с двумя выражениями, используя обычную замену s/find/replace/, например,

$ sed 's/rinfo/Rinfo/;s/^number/numbeR/' file
callingNumber: xxxxxxx
irrelevantnumbeRinfo: xxxxxxx
irrelevantnumbeRinfo2: xxxxxxx
numbeR: 12345678

или с grep,

$ grep -A3 callingNumber file | sed 's/rinfo/Rinfo/;s/^number/numbeR/'
(same result)

или как у вас есть, без -i, и вы гарантируете, что number не появится там, где вы не хотите изменять, например, grep -A3 callingNumber file | sed 's/number/numbeR/'


Редактирование на месте с помощью Range от Шаблон и следующие 3 строки

Вы можете использовать sed с выражением диапазона, чтобы произвести подстановку и отредактировать следующие 3 строки после callingNumber с помощью:

$ sed -i '/^callingNumber/,4s/number/numbeR/' file

Изменение 3-х строк после каждого вхождения callingNumber с помощью awk

Если вам нужно изменить три строки после каждого вхождения callingNumber, тогда вы можете используйте awk и перенаправьте на новый файл, а затем замените исходный файл, например,

awk '/^callingNumber/{n=0} n<=3 {sub(/number/, "numbeR");n++}1' file > newfile \
mv -f newfile file
0 голосов
/ 09 апреля 2020

С GNU sed:

sed -i '/callingNumber/,+3{ s/number/numbeR/ }' file

Вывод в файл:

callingNumber: xxxxxxx 
irrelevantnumbeRinfo: xxxxxxx
irrelevantnumbeRinfo2: xxxxxxx 
numbeR: 12345678
...