在Shell中,如何将字符串从一种形式替换为另一种形式
我有几个文件在很多地方都包含像在Shell中,如何将字符串从一种形式替换为另一种形式,shell,awk,Shell,Awk,我有几个文件在很多地方都包含像JOY\u DOL\u XXX这样的字符串。我想用另一个带双引号的字符串替换它,如“JOY.DOL.XXX”,但这里XXX可以是任何东西,例如MAN,CAT,DOG,所以在本例中,我想编写一个脚本,在不明确指定的情况下相应地替换它 例如: JOY_DOL_MAN ==> "JOY.DOL.MAN" JOY_DOL_CAT ==> "JOY.DOL.CAT" 你能帮我一下吗,我该怎么做。Sed似乎最简单: sed 's|JOY_DOL_\(...
JOY\u DOL\u XXX
这样的字符串。我想用另一个带双引号的字符串替换它,如“JOY.DOL.XXX”
,但这里XXX
可以是任何东西,例如MAN
,CAT
,DOG
,所以在本例中,我想编写一个脚本,在不明确指定的情况下相应地替换它
例如:
JOY_DOL_MAN ==> "JOY.DOL.MAN"
JOY_DOL_CAT ==> "JOY.DOL.CAT"
你能帮我一下吗,我该怎么做。Sed似乎最简单:
sed 's|JOY_DOL_\(...\)|"JOY.DOL.\1"|g' file
输入:
JOY_DOL_MAN
JOY_DOL_CAT
输出:
"JOY.DOL.MAN"
"JOY.DOL.CAT"
匹配三个字符。替换中的表示为\(…\)
\1
允许为每个输入模式替换多个匹配项g
- 此
awk
可能会起作用
awk '{gsub(/_/,".");print "\""$0"\""}' file
awk -F_ '{$1=$1;print "\""$0"\""}' OFS=. file
以支持更复杂的请求
echo ABC JOY_DOL_CAT XYZ | awk '{for (i=1;i<=NF;i++) {if (gsub(/_/,".",$i)) printf "\"%s\" ",$i; else printf "%s ",$i}print ""}'
ABC "JOY.DOL.CAT" XYZ
echo ABC JOY_DOL_CAT XYZ | awk'{for(i=1;我在字符串前后添加”
?XXX是否始终为3个字符?如果输入中出现JOY_DOL_FOOBAR
,所需的输出是-“JOY.DOL.FOO”BAR
还是“JOY.DOL.FOOBAR”“
或JOY\u DOL\u FOOBAR
或其他什么?$echo JOY\u DOL\u XXX | sed's | JOY\u DOL\u(…)| JOY.DOL.\1”| g'顺便说一句,您忘了在sed命令中为()添加斜线:echo“JOY\u DOL\u XXX”| sed's | JOY\u DOL\(…)| JOY.DOL.\1”|g'
。如果您使用-E
或-r
启用扩展正则表达式,即sed-E的| JOY_DOL(…)| JOY.DOL.\1“| g'
或sed-r的| JOY_DOL(…)| JOY.DOL.\1”|g
。这取决于sed的版本。我还有一个疑问,$echo JOY_DOL_XXXX | sed的| JOY_DOL_(…)|“JOY.DOL.\1”| g'将我的输出作为“JOY.DOL.XXX”X。但我希望这里的“JOY.DO.XXXX”可能是3个字符或更多。请为我找到“awk”提供解决方案上面给出的解决方案对这个案例很有效。谢谢。我现在注意到了另一个问题。#echo ABC JOY_DOL_CAT XYZ | awk'{gsub(/,);打印“\”“$0”\\”}输出:“ABC JOY.DOL.CAT XYZ”,但我期待ABC“JOY.DOL.CAT”XYZ这是正常的。当你更改请求时,你会得到不同的结果。这可能适用于你的上一个请求,但不适用于其他请求。echo ABC JOY\u DOL\u CAT XYZ{gsub(/\uu/,“);print$1,“\”“$2”\,$3}”
如果你有其他输入,创建一个新帖子,并添加一个完整的文件。在原始帖子中添加了新的示例。