我有标签处理过的文件。一个场景。
包含记录'RAZ'
。这里是关闭单引号我希望在同一时间用单引号NAME|SUB
`RAZ` |Rockpor`t
全局替换它
如果关闭单引号位于某个单词的中间,我不想替换。
例如:
sed -i "s/\’/'/g" Test.txt
我在下面尝试了命令
'RAZ'|Rockpor't
输出:
'RAZ'|Rockpor`t
期望的输出应该是:
{{1}}
请告知。
答案 0 :(得分:0)
你可以做这样的事情
您的输入文件,例如/tmp/abc.txt似乎
#cat /tmp/abc.txt
`ABC`|REsaff`t|`rest`
`PQR`|sasdasd`y|d`souza
现在,运行此命令
cat /tmp/abc.txt | sed s?\|?\\n\|?g | sed s?^\`?\'?g | sed s?\`\$?\'?g | sed s?^\|\`?\|\'?g | tr '\n' '#' | sed s?#\|?\|?g | tr '#' '\n'
该命令的作用是,它隔离所有选项卡值,如果选项卡的值以`开头和结尾,它替换为',然后再将所有选项卡合并在一起。
期望的输出:
'ABC'|REsaff`t|'rest'
'PQR'|sasdasd`y|d`souza
此解决方案适用于任意数量的标签。如果角色位于选项卡的开头或末尾,则将在所有选项卡中替换字符`。
注意:我在这里使用的分隔符是#
来隔离换行符,你可以相应地使用它。
答案 1 :(得分:0)
此perl命令将为您执行
perl -pe "s/`(?![a-z])|(?<![a-z])`/'/ig"
它取代了之前没有或没有字母
的所有反引号NAME|SUB
'RAZ' |Rockpor`t
答案 2 :(得分:0)
我建议
perl -pe 's/(^|\W)`(.*?)`($|\W)/$1\x27$2\x27$3/g'
扩展
perl -pe '
$q = "\x27"; # a single quote
s{
(^|\W) # start of line or a non-word char
` # the open quote
(.*?) # some non-quote characters
` # the close quote
($|\W) # end of line or a non-word char
}{$1$q$2$q$3}gx
'
演示
perl -pe '$q="\x27"; s/(^|\W)`(.*?)`($|\W)/$1$q$2$q$3/g' <<'END'
`foo`|I have James` hat|doesn`t
END
'foo'|I have James` hat|doesn`t
答案 3 :(得分:-1)