AIX 脚本中的 sed 不适用于特殊字符 [重复]

Posted

技术标签:

【中文标题】AIX 脚本中的 sed 不适用于特殊字符 [重复]【英文标题】:sed in AIX script do not work with special chars [duplicate] 【发布时间】:2016-10-04 13:41:20 【问题描述】:

我创建了一个生成 html 代码的脚本。 在脚本的最后,我需要通过将表格中的某些单词加粗来突出显示它们。

所以我需要在代码中替换每个实例 单词 经过 单词 要么 单词

当然,WORD 存储在一个变量 $CODE 中,这让这变得更加困难。

不幸的是,我尝试使用 sed 命令没有成功。

 sed -e 's/$CODE/<b>$CODE</b>/g' page.html > newpage.html

我也尝试使用双引号,在 / 之前使用转义字符,引号和双引号的许多组合,使用 |作为分隔符,总是没有成功。 如果你们中的任何人能指出我的解决方案,我会非常高兴。

PS : 也尝试​​使用 awk ...但使用变量它真的很痛苦 ...

编辑:这是我为大家提供帮助的确切代码。 code_list.txt 包含代码描述行列表。

 for y in code_list.txt
 do
      CODE=$(echo $y | cut -f1 -d-)
      awk -v code="$CODE" 'if(match($0,code))gsub(code,"<b>"code"</b>") 1' $SCRIPTS/html/daily_running_jobs.html > $SCRIPTS/html/daily_running_jobs_highlight.html
      mv $SCRIPTS/html/daily_running_jobs_highlight.html $SCRIPTS/html/daily_running_jobs.html  
 done

【问题讨论】:

小精度,如果我回显命令,变量翻译得很好。但是命令没有执行。 edit 您的问题包括简洁、可测试的样本输入和预期输出。包括那些你认为很难处理的用例,如果你的“WORD”可以包含任何非字母字符,那么也描述+显示这些用例。还包括像“the”和“There”这样的情况,这样我们就可以看到如何处理部分和区分大小写的匹配。最后 - 不要对非导出的变量名使用全大写,以避免与内置和其他导出的变量名发生冲突。 【参考方案1】:
awk -vcode="$CODE" 'if(match($0,code))gsub(code,"<b>"code"</b>") 1' page.html > newpage.html

假设有一个变量$CODE

我们将它传递给 awk 变量,如果匹配则替换

【讨论】:

谢谢切特。我会在星期一@work 试试这个。 awk 不是 C:'match($0,code)gsub(code,"&lt;b&gt;"code"&lt;/b&gt;") 1',但考虑到 code 的各种值,这将失败,就像等效的 sed 脚本一样,所以如果它是正确的答案,那就别想了。此外,通过不在 -vcode 之间放置空格,您会使脚本不必要地特定于 gawk,只需在其中放置一个空格以便于移植:-v code=... 嗨,我刚刚尝试了 awk 选项,但效果并不好:#highlight the important application codes for y in $(cat $SCRIPTS/$APP) do CODE=$(echo $y | cut -f1 -d-) awk -v code="$CODE" 'if(match($0,code))gsub(code,""code"") 1' $ SCRIPTS/html/daily_running_jobs.html > $SCRIPTS/html/daily_running_jobs_highlight.html 完成 它给了我那个错误:+ awk -v code=NTCA EBXL FSRV if(match($0,code))gsub(code,""code"" ) 1 /home/ppcm980x/ctm_em/etc/emweb/tomcat/webapps/commvault/scripts/html/daily\_running_jobs.html + 1> /home/ppcm980x/ctm_em/etc/emweb/tomcat/webapps/commvault/ scripts/html/daily_running_jobs_highlight.html awk:字符串 NTCA 不能包含换行符。源代码行是 1。错误上下文是 >>> 我必须明确,如果我在 -v code="TEST" 中硬编码一个值,那么它就可以工作。但是在这里使用变量是行不通的。【参考方案2】:

如果

你使用 " 而不是 '

$CODE 表达式中没有@EDIT: 并且没有换行符)(将/ 替换为@

sed -e "s@$CODE@&lt;b&gt;$CODE&lt;/b&gt;@g" page.html &gt; newpage.html

您的解决方案的问题在于引用,并且 sed 正则表达式分隔符 / 也用于您的替换表达式,如 &lt;/b&gt;

EDIT - 从文件中替换多个值

如果您有一个文件 code_list.txt,其中所有要替换的字符串都在一行中,请执行

cp page.html  newpage.html
while read var
do
    mv newpage.html newpage1.html
    sed -e "s@$var@<b>$var</b>@g" newpage1.html > newpage.html
    # optionally rm newpage1.html
done < code_list.txt

【讨论】:

我会再试一次,但我想我已经尝试过 |代替 @。明天我会告诉你更多。 对不起 Stefan,但它不起作用。我有那个错误信息。变量 CODE 被 NTCA 替换:sed: Function s@NTCA cannot be parsed. 根据您对 Chet 的回答的评论,我想您的变量 CODE 不包含“NTCA”而是“NTCA EBXL FSRV”,甚至可能在其中的某个地方包含一个 NEWLINE 字符 - 请您验证这是否是有意的或者如果代码应该工作,如果只有“NTBA”之后没有任何内容是 $CODE 的值 - 请报告echo "&gt;&gt;$CODE&lt;&lt;" 的输出。如果您需要用换行符替换字符串,我们可能必须考虑完全不同的东西...... 再次抱歉 Stefan,但它仍然无法正常工作。我回显了要检查的命令,并且 var 很好地被代码替换了,但是没有执行 sed 命令。我不得不删除 -i 因为我的系统不支持它。我使用 > output.html 将 sed 输出写入另一个文件。没有更多的成功。 我的坏斯特凡。它就像一个魅力!我看错了 html 文件 :-) 非常感谢您的支持。

以上是关于AIX 脚本中的 sed 不适用于特殊字符 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

用于传递文件名并运行的 shell 脚本 [重复]

while 循环中的 sed 命令不适用于 ubuntu

使用grep和sed递归查找和替换所有文件中的字符串[重复]

模式在regex101上运行但不适用于Google脚本[重复]

AIX中怎么用sed把某字符转换成换行符

正则表达式验证规则,以避免特殊字符不适用于 laravel 中的文本字段