逃避角色" \"不用awk工作

时间:2014-06-27 09:51:56

标签: shell awk

以下是我的示例数据:

"UDBPEM1 "."HISTOGRAMBIN_@@@@@002__UDBDI02$" 
"UDBPEM1 "."HISTOGRAMBIN_@@@@@002__UDBDI02$"

放在tt文件中,我想替换" HISTOGRAMBIN _ @@@@@ 002__UDBDI02 $"与" HISTOGRAMBIN _ @@@@@ 002__UDBDI02 $ _MIG"

我在awk命令下方使用它来执行此操作但未进行替换。

awk '/HISTOGRAMBIN_@@@@@002__UDBDI02\$/ {sub("'HISTOGRAMBIN_@@@@@002__UDBDI02\$'","'HISTOGRAMBIN_@@@@@002__UDBDI02\$_MIG'")} {print}' tt

请让我知道该命令有什么问题。

谢谢, 勒凯什

添加更多信息:

此处的awk命令用于替换从另一个文件中选取的对象名称。 $可以在名称中的任何位置,但我希望_mig在最后。我在我的脚本中使用的实际awk命令如下:

awk '/"'${TAB_NAME}'"/{if (M==""){sub("'${TAB_NAME}'","'${TAB_NAME}_${TAB_EXT}'");M=1}}{print}'  filename

我必须使用""扩展awk以使用shell变量,我只想替换第一次出现。

谢谢, 勒凯什

4 个答案:

答案 0 :(得分:0)

您可以将sed用于此目的而不需要替换整个字符串只需将$替换为$_MG即可,

$ sed -r 's/^([^$]*\$)(.*)$/\1_MG\2/g' file
"UDBPEM1 "."HISTOGRAMBIN_@@@@@002__UDBDI02$_MG" 
"UDBPEM1 "."HISTOGRAMBIN_@@@@@002__UDBDI02$_MG"

更简单的一个,

$ sed 's/\$/$_MG/g' file
"UDBPEM1 "."HISTOGRAMBIN_@@@@@002__UDBDI02$_MG" 
"UDBPEM1 "."HISTOGRAMBIN_@@@@@002__UDBDI02$_MG"

答案 1 :(得分:0)

在您的awk行中,引号未正确使用。做

awk '{sub(/H....\$/, "replacement")}7' file

答案 2 :(得分:0)

awk '{sub(/\$/,"$_MG")}1' file

sed 's/\$/$_MG/' file

当你写道:

awk '...sub("'HISTOGRAMBIN_@@@@@002__UDBDI02\$'",...)...' file

使用sub()的单引号导致您的shell脚本退出并重新输入awk awk脚本规范,因此HISTOGRAMBIN_@@@@@002__UDBDI02\$首先由shell解释,然后因为您有RE用双引号括起来而不是RE分隔符(/),结果字符串被awk解释两次,一次是在读取脚本时,然后在执行时再次解释。所以 - 你必须至少3次逃脱$,之后awk有机会在脚本执行时仍然被转义。

答案 3 :(得分:0)

谢谢大家,

我的awk命令正在运行

awk '/'${TAB_NAME}'/ {if (M==""){sub(/'$TAB_NAME'/,"'${TAB_NAME}_${TAB_EXT}'");M=1}}{print}' tt

感谢kentEd Mortonavinash-raj寻求帮助。