以下是我的示例数据:
"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变量,我只想替换第一次出现。
谢谢, 勒凯什
答案 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
感谢kent,Ed Morton和avinash-raj寻求帮助。