在 Bash 脚本中替换字符串

在 Bash 脚本中替换字符串

我尝试在脚本中执行以下命令:

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 个单词以大写字母开头...

相关内容