2015-11-11 4 views
-1

Каков наилучший способ вызвать sed по результатам grep и сохранить его в файл? Я хочу изменить некоторые строки в текстовом файле, например.Вызов sed на результаты grep - скрипт/текстовая обработка linux shell

Привет {Tom Mary Andy}

Что {Eric John Ted}

Привет {Jerry Katy Mark}

Так что моя проблема в том, что я хочу добавить, например, буквы Т перед всеми именами, которые заключены между скобками {} в строках, которые являются строками «Hi» и перезаписывают файл. Результаты должно выглядеть так:

Привет {T.Tom T.Mary T.Andy}

Что {Eric John Ted}

Привет {T.Jerry T.Katy T.Mark}

Как вы думаете, а лучшее решение/команды? Я собираюсь написать сценарий оболочки для этого. Я знаю, что я могу grep, что линии, позже изменить его на массив и concat, но я не думаю, что это хорошее решение :) Спасибо за вашу помощь.

+0

В общем, нет необходимости в этом: 'sed' может выполнять всю работу, которая сама' grep' может (и 'awk' еще более гибкая, чем любая). Если вы указали строку 'grep', мы можем показать вам, как ее свернуть в' sed' (или реализовать желаемую логику как изначально в 'awk'). –

+0

... если вы не возражаете против какой-либо дополнительной многословности, все это можно сделать изначально в bash (без внешних инструментов - без 'sed',' grep' или 'awk'). –

+0

Теперь я подсчитываю количество вхождений, создаю для цикла в этом диапазоне. На каждой итерации я сохраняю результаты grep, которые возвращают текущий вид, удаляют скобки и команду Hi, изменяют строковую переменную на массив и делают цикл для добавления в начале каждого слова буквой T. В конце я обмениваюсь линией строки «Привет» с моей новой измененной линией Hi. – TheOmniano

ответ

6

Если у вас есть:

Hi { Tom Mary Andy } 
What { Eric John Ted } 
Hi { Jerry Katy Mark } 

и хотите вставить 'T.' перед каждой буквы в строках, начиная с 'Hi», чтобы получить:

Hi { T.Tom T.Mary T.Andy } 
What { Eric John Ted } 
Hi { T.Jerry T.Katy T.Mark } 

Затем вы можете сделать это с помощью одной только sed , Для редактирования файла в месте, используйте '-i' вариант для sed:

sed -i '/^Hi/s/\s\([A-Z]\)/ T.\1/g' filename.txt 

Примечание: создать резервную копию исходного файла, используйте sed -i.bak

Если вы используете Mac или другой ОС где sed предоставляется без опции '-i', то вы можете использовать:

sed '/^Hi/s/\s\([A-Z]\)/ T.\1/g' <filename.txt> newfilename.txt 

с результатами в newfilename.txt

+0

'-i', являющийся не-POSIX-заданным и несовместимым в использовании между GNU и реализациями Apple, не рекомендуется предлагать без явных оговорок. –

+0

Спасибо, Чарльз, узнал что-то. Я поправляю. –

+0

Спасибо за вашу быструю помощь :) У меня есть еще один вопрос: как я могу достичь того же, но когда команда te start будет, например, > Привет всем {Tom Mark Katy} Потому что, используя вашу формулу, T также вставлен в начале каждого. – TheOmniano

Смежные вопросы