У меня есть файл со словами, по одному слову в строке, который я сейчас хочу изменить, чтобы он стал .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
, это будет нормально.
Очень благодарен за любую помощь.
Можно также обработать список слов со следующим 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
Следующая команда:
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`
Поскольку это сложилось, Вы используете разрывы строки 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`