我尝试在脚本中执行以下命令:
find=grep "$jasper" jasperreports.properties | awk -F"reports/" '{print $2}'
示例输出:
maps
我想将此输出更改为其他内容,例如charts
。为此,我尝试了:
sed -i /"$find"/charts
sed
给我带来了问题,它需要一个输入文件,但我没有。有没有办法将 grep 和 awk 的输出通过管道传输到 sed?
答案1
-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.
答案2
您始终可以提供一个伪文件< <(command)
流程替代句法:
sed -e "/$find/charts" < <(grep "$jasper" jasperreports.properties | awk -F"reports/" '{print $2}')
答案3
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
我正在尝试做的事情如下:
1. 在目录中找到所有名为 jasperreport.properties 的文件(包括前面代码中的 3 行,三行相同,只有不同的单词“maps、charts、widgets”)
2. 分别指向每一行并将主机 IP 地址更改为 3 行,注意将“maps、charts、widgets”保留在中间,将“Maps、Charts、Widgets”保留在末尾,并且如您所见,末尾的 3 个单词以大写字母开头...