【问题标题】:not able to get proper output for sed command无法为 sed 命令获得正确的输出
【发布时间】:2020-12-03 08:36:09
【问题描述】:

我有一个名为 WSH.txt 的文件,其中包含内容 -

"WSH"."WSH_INTERFACE_ERRORS"

所以这里我真正需要的是 - "WSH"." 应该被空格替换。

所以现在我创建了一个名为 sed.sh 的脚本,我在其中给出了 -

SUBSTR=$(echo $1 | cut -d'.' -f 1)

sed -i 's/"$SUBSTR"."/ /g' $1

但是当我尝试运行 ./sed.sh WSH.txt 时,我得到了输出 -

# cat WSH.txt
"WSH"."WSH_INTERFACE_ERRORS"

(抱歉无法在此处添加图片)

但我想要的输出是 -

WSH_INTERFACE_ERRORS

我也试过 -

sed -i 's/"${SUBSTR}"."/ /g' $1

但它仍然没有给出结果。

有人可以帮我吗?!
提前致谢!

【问题讨论】:

  • 请阅读如何发布问题并尝试使您未来的问题更具可读性,而不是仅仅复制没有任何语法突出显示或段落的代码。
  • 另外,向我们展示您获得的输出以及您想要的输出。这需要澄清。
  • 感谢@agentsmith 的建议,我会在发布问题时牢记这一点!再次感谢您!
  • 是的@PaulHodges,我已经编辑了我的问题,我已经给出了我得到的输出和我想要的输出!

标签: regex linux bash sed centos


【解决方案1】:

编辑

我完全看错了。

假设引号在文件本身中...
该变量在单引号内,因此未被解析。

确保你也得到了最后的报价。

sed -i '/"'"$SUBSTR"'"[.]"/{ s/"//g; s/'"$SUBSTR"'[.]/ /; }' $1

这会扫描与所需模式匹配的行,忽略所有其他行。
在比赛中,它

  • 用第一个 s/// 消除文件中的所有双引号
  • 然后关闭单引号,以便第二个双引号可以正确引用您的变量,以防有嵌入空格等,
  • 然后关闭变量后的双引号,
  • 再次打开单引号,
  • 括号-引用您要匹配的文字点,
  • 然后结束搜索模式并将其替换为空格。

原始(错误)答案


如果我没看错的话,你需要做很多工作才能做到这一点:

sed -Ei 's/[^ ]+[.]//' WSH.txt

阻止它工作的问题是不匹配的双引号。您将它们作为模式的一部分。

sed -i 's/"$SUBSTR"."/ /g' $1 # sub "WSH"<anychar>", not what you want.
       ^  ^       ^ ^    ^

双打在单打内,所以它们作为文字字符传递给 sed。 我认为您正在寻找的线路是其中之一:

sed -i "s/$SUBSTR[.]/ /g" $1 # double quotes around the whole pattern

sed -i 's/'"$SUBSTR"'[.]/ /g' $1 # switching quotes 

甚至,对于这种情况,

sed -i s/"$SUBSTR"'[.]/ /g' $1 # only quote what needs it 

在任何一种情况下,您实际所做的都是在命令行上将模式构建为字符串,然后将其传递给sed。引号不是 for sed - 它们是这样命令解析器在将字符串传递给 sed 之前 正确获取字符串,除非它们是打算作为模式的一部分。

https://www.gnu.org/software/sed/manual/sed.html#BRE-syntaxsed BRE 语法。
https://www.gnu.org/software/sed/manual/sed.html#ERE-syntaxsed ERE 语法。
https://www.gnu.org/software/bash/manual/html_node/Quoting.htmlbash 引用。

【讨论】:

  • 嗯。引号在文件中,不是吗?编辑。
  • 嘿保罗霍奇斯!我在这里有一个疑问......实际上在我的文件中它们也是以“(引号)开头的其他词。所以我不希望全部被替换。我只想要那个模式(“$SUBSTR”。“)被替换!你能帮我解决这个问题吗?!
  • 当然。给我几分钟。 :)
  • 添加匹配行选择 - sed 代码中的内置 grep。立即尝试。
  • 嘿@Paul Hodges。如果我在 "WSH"."WSH_INTERFACE_ERRORS" 之前添加了一些其他单词,那么它似乎不起作用,例如,如果我给 - "WSH"."WSH_INTERFACE_ERRORS" ,那么它似乎不起作用。它给我的输出和它一样 - “WSH”。“WSH_INTERFACE_ERRORS”所以,我应该在 sed 命令中添加什么以使其工作提前谢谢!
【解决方案2】:

您可以在一个命令中完成替换:

sed 's/"WSH"."/ /g' WSH.txt

输出:(SPACE)WSH_INTERFACE_ERRORS" 这不是你需要的吗?

【讨论】:

  • 感谢@FEIdin 的回复,实际上我没有传递 WSH.txt,而是动态传递它,即 $f。所以这就是为什么它对我不起作用
  • 好吧@saurabh704 : for f in *;做 ; sed 's/"WSH"."/ /g' $f ; done 也会这样做。关键是您正在为一项简单的任务做很多工作,或者问题不清楚。谢谢
  • 感谢@FEldin 的回复。实际上,在这里我不是基于一个文件创建脚本,仅 WSH.txt .....我必须在 for 循环的帮助下动态传递它们的 n 个文件。这就是我面临困难的原因。现在出于提问的目的,我在这里只提到一个文件名。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多