Заменить строку в скрипте bash

Я попробовал следующую команду в своем скрипте:

find=grep "$jasper" jasperreports.properties | awk -F"reports/" '{print $2}'

Пример вывода:

maps

Я хочу изменить этот вывод на что-то другое, например charts. Для этого я попытался:

sed -i /"$find"/charts

sed вызывает у меня проблемы, ему нужен входной файл, но у меня его нет. Есть ли способ передать вывод из grep и awk в sed?

1
задан 21 March 2011 в 00:24

3 ответа

-i можно использовать только с sed, если вы передаете файл, это означает «встроенную замену». Без этого вывод sed будет записан в stdout (обычно вывод консоли). С -i он выполняет встроенную замену , то есть выполняет замены в самом файле.

Следующий код считывает содержимое jasperreports.properties в переменную $input (строка 1) и находит заменяемую строку (строка 2).
В третьей строке он выводит входную строку и передает ее через sed для замены. sed выводит строку в stdout, которая будет перехвачена $( и ) и, следовательно, будет сохранена в $input.

read input < jasperreports.properties
find=$(grep "$jasper" jasperreports.properties | awk -F"reports/" '{print $2}')
input=$(echo "$input" | sed "s/$find/charts/")

Если вы хотите немедленно применить изменения к файлу:

find=$(grep "$jasper" jasperreports.properties | awk -F"reports/" '{print $2}')
sed "s/$find/charts/" -i jasperreports.properties

Из man sed :

   s/regexp/replacement/
          Attempt   to   match  regexp  against  the  pattern  space.   If
          successful, replace that portion matched with replacement.   The
          replacement may contain the special character & to refer to that
          portion of the pattern space  which  matched,  and  the  special
          escapes  \1  through  \9  to refer to the corresponding matching
          sub-expressions in the regexp.
0
ответ дан 21 March 2011 в 00:24

Вы всегда можете предоставить псевдофайл с синтаксисом процесса подстановки процесса < <(command) :

sed -e "/$find/charts" < <(grep "$jasper" jasperreports.properties | awk -F"reports/" '{print $2}')
0
ответ дан 21 March 2011 в 00:24
jasper=( maps charts widgets )
jasper1=( Maps Charts Widgets )


count=${#jasper[*]}            
jasper_path=`find . -type f -name 'jasperreports.properties'`

count=${#jasper[*]}
for (( i=0;i<$count;i++ )); do
sed -i "/${jasper[i]}.base/c com.jaspersoft.jasperreports.fusion.${jasper[i]}.base.swf.url=https://$host/webcare/reports/${jasper1[i]}" $jasper_path
done

другое решение ()
find=$(grep "maps.base" jasperreport.properties | awk -F"reports/" '{print $2}';sed "s/$find/$host/" jasperreport.properties > tmp.txt.txt && mv tmp.txt jasperreport.properties

я пытаюсь сделать следующее:
[ 113] 1. найти все файлы в каталоге, которые имеют имя jasperreport.properties (которые включают в себя 3 строки, как вы видите из предыдущего кода, три строки - это только разные слова «карты, диаграммы, виджеты»)

2. указать каждую строку в отдельности и изменить IP-адрес хоста для 3-х трех строк, стараясь держать «карты, диаграммы, виджеты» посередине и «карты, диаграммы, виджеты» в конце и, как вы видите, 3 слова в конце начинаются с заглавной ...

0
ответ дан 21 March 2011 в 00:24

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

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