Shell:查找并替换单词

Shell:查找并替换单词

我的 shell 脚本中有一个固定格式的字符串:'[STATUS REPORT] PROJECT'。当用户执行我的 shell 脚本时,他将被要求提供一个值'PROJECT'

我想'PROJECT'用用户提供的值替换该词。例如,如果'ABCD'是用户输入:

'[状态报告] ABCD'

我有两个问题:1:如何处理项目名称中像“&”这样的特殊字符?例如:

echo "[STATUS REPORT] PROJECT" |  awk '{ gsub(/PROJECT/, "A&A"); print }' 

我得到以下输出:

[状态报告] 项目

2:我的实际shell语句如下:

echo "[STATUS REPORT] PROJECT" |  awk '{ gsub(/PROJECT/, $ProjectName); print }'

其中 $ProjectName 存储用户提供的项目名称。但这似乎不起作用

我怎样才能让它正常工作?

答案1

这将解决您的第一个问题:

echo "[STATUS REPORT] PROJECT" |  awk '{ gsub(/PROJECT/, "A\\&A"); print }'

&是 awk 替换中的特殊字符:它表示“已匹配的内容”。您需要用 来转义 if \。并且由于您在 awk 字符串中,因此您需要输入 2\来生成一个作为\转义下一个字符,如\n。)

这将解决你的第二个问题:

ProjectName=toto
echo "[STATUS REPORT] PROJECT" |  awk -v "ProjectName=$ProjectName" '{ gsub(/PROJECT/, ProjectName); print }'

编辑:请注意新添加的"空格ProjectName=$ProjectName,这样ProjectName不会破坏脚本。)

但是 awk 是执行字符串替换的重要工具,您可能需要使用 sed:

echo "[STATUS REPORT] PROJECT" |  sed -e 's/PROJECT/A\&A/'
ProjectName=toto;
echo "[STATUS REPORT] PROJECT" |  sed -e "s/PROJECT/${ProjectName//\//\\/}/"

编辑: a/ProjectName破坏初始解决方案。我添加了斜线的转义,但其他一些字符仍然会破坏它:&,,\1... 我认为下面的普通 bash shell 更安全。)

或者在普通的 bash shell 中:

msg="[STATUS REPORT] PROJECT"
echo ${msg//PROJECT/A&A}
ProjectName=toto
echo ${msg//PROJECT/$ProjectName}

答案2

(抱歉,我这里没有评论权限)

从您发布的代码片段中,不太清楚为什么需要将字符串传输到awk

您可以简单地在语句中使用该变量echo,bash 将替换该变量:

echo "[STATUS REPORT] $ProjectName"

相关内容