我的 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"