我正在尝试使用一个小型 bash 脚本,使用 sed 来附加字符串,但我似乎无法使其工作。 我想将一个字符串附加到另一个字符串模式:
输入文件中的字符串:
Xabc
Xdef
期望的输出:
XabcZ
XdefZ
这是脚本:
#!/bin/bash
instring="$2"
sed -r "s/${instring}/${instring}Z/g" $1
其中 $1 是文件名,$2 是我要查找的字符串模式
然后我运行脚本:
bash script.test.sh test.txt X
输出:
XZabc
XZdef
正如预期的那样。
但如果我使用正则表达式:
bash script.test.sh test.txt X...
我得到的是:
X...Z
X...Z
很明显,它在命令的替换部分中没有正确读取它。如果我使用 X[a-z09](但我的字符串中可能有“_”,我也想包括这些),那就太糟糕了。我查看了之前的几个类似主题,但我似乎无法正确实现任何解决方案(请忍受新手......)。感谢您的热心帮助。
编辑:收到 Glenn Jackman(已接受的解决方案)和 RavinderSingh13 的答案后,我想为遇到类似问题的人澄清两点:
1) Glenn Jackman 解决方案不起作用,因为我需要将文本文件从 DOS 转换为 Unix。我用 dos2unix
做到了,但由于某种原因不起作用(也许忘记将输出覆盖到旧文件?)。我后来使用 sed -i 's/\r$//' test.txt 做到了;这解决了问题,格伦的解决方案现在有效。拥有一个 dos 格式的文本文件是许多麻烦的根源,至少对我来说是这样。
2)我可能没有明确表示我只想定位输入文件中的特定行;我的示例只有目标字符串,但实际文件包含我不想编辑的字符串。这可能是 RavinderSingh13 的脚本发生的误解,该脚本实际上有效,但针对每一行。 希望这可以帮助 future 的读者。谢谢你,Stackers,你再次拯救了这一天:)
最佳答案
你所拥有的(sed -r "s/${instring}/${instring}Z/g"$1
)使用变量作为模式左侧为纯文本,右侧为纯文本。
你想做的是:
sed -r "s/${instring}/&Z/g" $1
# ....................^
其中 &
标记被替换为模式匹配的任何文本。在 The s
Command 的文档中:
[T]he replacement can contain unescaped
&
characters which reference the whole matched portion of the pattern space.
关于regex - sed 和正则表达式 : unexpected replacement pattern,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50881408/