Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Shell中,如何将字符串从一种形式替换为另一种形式_Shell_Awk - Fatal编程技术网

在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}”
      如果你有其他输入,创建一个新帖子,并添加一个完整的文件。在原始帖子中添加了新的示例。