无法为sed命令获得正确的输出

问题描述

我有一个名为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

但是仍然没有给出结果。

有人可以帮我吗?!
预先感谢!

解决方法

编辑

我读错了。

假设引号在文件本身中...
该变量位于单引号内,因此无法解析。

请确保在结尾处也引用报价。

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。引号不是 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引用。

,

您可以用一个命令进行替换:

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

输出:(SPACE)WSH_INTERFACE_ERRORS“ 那不是您所需要的吗?