无法获得 sed 命令的正确输出
not able to get proper output for sed command
我有一个名为 WSH.txt
的文件,其中包含内容 -
"WSH"."WSH_INTERFACE_ERRORS"
所以我真正需要的是 - "WSH"."
应该替换为空白 space。
所以现在我创建了一个名为 sed.sh
的脚本,其中我给出了 -
SUBSTR=$(echo | cut -d'.' -f 1)
sed -i 's/"$SUBSTR"."/ /g'
但是当我尝试 运行 ./sed.sh WSH.txt
时,我得到了输出 -
# cat WSH.txt
"WSH"."WSH_INTERFACE_ERRORS"
(抱歉我无法在此处添加图片)
但我想要的输出是 -
WSH_INTERFACE_ERRORS
我也试过 -
sed -i 's/"${SUBSTR}"."/ /g'
但是还是没有结果。
有人可以帮我解决这个问题吗?!
提前致谢!
编辑
我完全看错了。
假设引号在文件本身中...
该变量在单引号内,因此未被解析。
确保你也能在最后得到报价。
sed -i '/"'"$SUBSTR"'"[.]"/{ s/"//g; s/'"$SUBSTR"'[.]/ /; }'
这将扫描匹配所需模式的行,忽略所有其他行。
在一场比赛中,它
- 从文件中删除所有第一个 s///
的 double-quotes
- 然后关闭单曲,以便第二个 double-quotes 可以正确引用您的变量,以防嵌入 space 等,
- 然后关闭变量后的双引号,
- 再次打开单引号,
- bracket-quotes你要匹配的文字点,
- 然后结束搜索模式并将其替换为 space。
原(错误)答案
如果我没看错的话,您需要做很多工作才能做到这一点:
sed -Ei 's/[^ ]+[.]//' WSH.txt
阻止它工作的问题是双引号不匹配。您将它们作为模式的一部分包含在内。
sed -i 's/"$SUBSTR"."/ /g' # sub "WSH"<anychar>", not what you want.
^ ^ ^ ^ ^
双打在单打中,因此它们作为文字字符传递给 sed。
我认为您要查找的行是其中之一:
sed -i "s/$SUBSTR[.]/ /g" # double quotes around the whole pattern
或
sed -i 's/'"$SUBSTR"'[.]/ /g' # switching quotes
甚至,对于这种情况,
sed -i s/"$SUBSTR"'[.]/ /g' # only quote what needs it
无论哪种情况,您实际做的是在命令行上将模式构建为字符串,然后将其传递给 sed
。引号不是 for sed
- 它们是这样命令解析器在 将字符串传递给 [=16= 之前 获得正确的字符串],除非打算将它们作为模式的一部分包含在内,否则永远不会看到它们。
https://www.gnu.org/software/sed/manual/sed.html#BRE-syntax 是 sed
BRE 语法。
https://www.gnu.org/software/sed/manual/sed.html#ERE-syntax 是 sed
ERE 语法。
https://www.gnu.org/software/bash/manual/html_node/Quoting.html 是 bash
引用。
您可以通过一条命令完成替换:
sed 's/"WSH"."/ /g' WSH.txt
输出:(SPACE)WSH_INTERFACE_ERRORS"
这不是你需要的吗?
我有一个名为 WSH.txt
的文件,其中包含内容 -
"WSH"."WSH_INTERFACE_ERRORS"
所以我真正需要的是 - "WSH"."
应该替换为空白 space。
所以现在我创建了一个名为 sed.sh
的脚本,其中我给出了 -
SUBSTR=$(echo | cut -d'.' -f 1)
sed -i 's/"$SUBSTR"."/ /g'
但是当我尝试 运行 ./sed.sh WSH.txt
时,我得到了输出 -
# cat WSH.txt
"WSH"."WSH_INTERFACE_ERRORS"
(抱歉我无法在此处添加图片)
但我想要的输出是 -
WSH_INTERFACE_ERRORS
我也试过 -
sed -i 's/"${SUBSTR}"."/ /g'
但是还是没有结果。
有人可以帮我解决这个问题吗?!
提前致谢!
编辑
我完全看错了。
假设引号在文件本身中...
该变量在单引号内,因此未被解析。
确保你也能在最后得到报价。
sed -i '/"'"$SUBSTR"'"[.]"/{ s/"//g; s/'"$SUBSTR"'[.]/ /; }'
这将扫描匹配所需模式的行,忽略所有其他行。
在一场比赛中,它
- 从文件中删除所有第一个 s/// 的 double-quotes
- 然后关闭单曲,以便第二个 double-quotes 可以正确引用您的变量,以防嵌入 space 等,
- 然后关闭变量后的双引号,
- 再次打开单引号,
- bracket-quotes你要匹配的文字点,
- 然后结束搜索模式并将其替换为 space。
原(错误)答案
如果我没看错的话,您需要做很多工作才能做到这一点:
sed -Ei 's/[^ ]+[.]//' WSH.txt
阻止它工作的问题是双引号不匹配。您将它们作为模式的一部分包含在内。
sed -i 's/"$SUBSTR"."/ /g' # sub "WSH"<anychar>", not what you want.
^ ^ ^ ^ ^
双打在单打中,因此它们作为文字字符传递给 sed。 我认为您要查找的行是其中之一:
sed -i "s/$SUBSTR[.]/ /g" # double quotes around the whole pattern
或
sed -i 's/'"$SUBSTR"'[.]/ /g' # switching quotes
甚至,对于这种情况,
sed -i s/"$SUBSTR"'[.]/ /g' # only quote what needs it
无论哪种情况,您实际做的是在命令行上将模式构建为字符串,然后将其传递给 sed
。引号不是 for sed
- 它们是这样命令解析器在 将字符串传递给 [=16= 之前 获得正确的字符串],除非打算将它们作为模式的一部分包含在内,否则永远不会看到它们。
https://www.gnu.org/software/sed/manual/sed.html#BRE-syntax 是 sed
BRE 语法。
https://www.gnu.org/software/sed/manual/sed.html#ERE-syntax 是 sed
ERE 语法。
https://www.gnu.org/software/bash/manual/html_node/Quoting.html 是 bash
引用。
您可以通过一条命令完成替换:
sed 's/"WSH"."/ /g' WSH.txt
输出:(SPACE)WSH_INTERFACE_ERRORS" 这不是你需要的吗?