Использование sed для добавления текста в файл до и после слова

У меня есть файл со словами, по одному слову в строке, который я сейчас хочу изменить, чтобы он стал .sh-файлом со строкой egrep-search для каждого слова. Строка поиска, которую я хочу в конце, выглядит следующим образом:

`egrep -wi '\|WORD\.\.nn' stats_all.txt > WORD_frekvens.txt`

Файл моего слова выглядит так:

$ more -10 word_file.txt
anakonda
ord
tröja
bord
glas
pension
larm
risk
försening
rapport

Я пытался сделать это со следующей строкой:

sed -e 's/\(.*\)/egrep -wi '\''\\|\1\\.\\.nn'\'' stats_all.txt > \1_frekvens.txt/' word_file.txt | more

Но он дает вывод:

_frekvens.txt_all.txt > WORD

Почему не работает здесь использование \1? Похоже, именно в этом и заключается проблема, так как она работает, если я обменяю ее на слово.

Все, что я пишу после \1, заканчивает тем, что пишет поверх содержания \1, то есть «СЛОВО». Если я напишу что-то только до \1, это будет нормально.

Очень благодарен за любую помощь.

1
задан 1 June 2015 в 19:43

3 ответа

Можно также обработать список слов со следующим perl команда:

$ perl -ne 's/\s*$//; print "egrep -wi \047\|${_}\.\.nn\047 stats_all.txt > ${_}_frekvens.txt\n"' word_file.txt

Примечание, которое я использую \047, чтобы не выходить ' (одинарная кавычка).

С макетом word_file.txt:

foo
bar

вывод:

egrep -wi '\|foo\.\.nn' stats_all.txt > foo_frekvens.txt
egrep -wi '\|bar\.\.nn' stats_all.txt > bar_frekvens.txt
0
ответ дан 1 June 2015 в 19:43

Следующая команда:

sed -e "s/\(.*\)/\`egrep -wi '\\\|\1\\\\.\\\.nn' stats_all.txt > \1_frekvens.txt\`/" word_file.txt

дает вывод:

`egrep -wi '\|anakonda\.\.nn' stats_all.txt > anakonda_frekvens.txt`
`egrep -wi '\|ord\.\.nn' stats_all.txt > ord_frekvens.txt`
`egrep -wi '\|tröja\.\.nn' stats_all.txt > tröja_frekvens.txt`
`egrep -wi '\|bord\.\.nn' stats_all.txt > bord_frekvens.txt`
`egrep -wi '\|glas\.\.nn' stats_all.txt > glas_frekvens.txt`
`egrep -wi '\|pension\.\.nn' stats_all.txt > pension_frekvens.txt`
`egrep -wi '\|larm\.\.nn' stats_all.txt > larm_frekvens.txt`
`egrep -wi '\|risk\.\.nn' stats_all.txt > risk_frekvens.txt`
`egrep -wi '\|försening\.\.nn' stats_all.txt > försening_frekvens.txt`
`egrep -wi '\|rapport\.\.nn' stats_all.txt > rapport_frekvens.txt`
0
ответ дан 1 June 2015 в 19:43

Поскольку это сложилось, Вы используете разрывы строки Windows (\r\n) в файле. Из-за этого факта, я скорректировал свои команды, отметьте … gsub(/\r/,"") …

Это - простая задача для awk:

awk 'gsub(/\r/,"") {print "`egrep -wi \047\\|" $_ "\\.\\.nn\047 stats_all.txt > "$_"_frekvens.txt`"}' <your_input_file>

записать вывод во входном файле:

awk -i inplace 'gsub(/\r/,"") {print "`egrep -wi \047\\|" $_ "\\.\\.nn\047 stats_all.txt > "$_"_frekvens.txt`"}' <your_input_file>

записать вывод в новом файле:

awk 'gsub(/\r/,"") {print "`egrep -wi \047\\|" $_ "\\.\\.nn\047 stats_all.txt > "$_"_frekvens.txt`"}' <your_input_file> > output_file

Образец со встроенным редактированием

% cat words
foo
bar

% awk -i inplace 'gsub(/\r/,"") {print "`egrep -wi \047\\|" $_ "\\.\\.nn\047 stats_all.txt > "$_"_frekvens.txt`"}' words

% cat words                                                                                               
`egrep -wi '\|foo\.\.nn' stats_all.txt > foo_frekvens.txt`
`egrep -wi '\|bar\.\.nn' stats_all.txt > bar_frekvens.txt`
1
ответ дан 1 June 2015 в 19:43

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

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