regex - sed 和正则表达式 : unexpected replacement pattern

标签 regex bash sed

我正在尝试使用一个小型 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/

相关文章:

linux - SED 不打印最后的输入

text - sed 替换单/双引号文本?

mysql - 如何在 SQL 友好的正则表达式中匹配标签外但不在标签内的 URL

regex - 在第一次出现模式之后和另一个模式之前提取字符串

linux - 尝试运行从另一台计算机复制的程序时权限被拒绝

string - 如何在 bash 中的两个函数之间传递包含空格的字母数字变量?

linux - 如何在Linux中使用sed将文本文件分割成10个以上字符的 block 而不分割单词?

regex - 匹配反斜杠后跟转义字符

c++ - 如何从 C++ 中的 curl 输出中搜索所有出现的正则表达式?

linux - cronjob 不执行独立运行的脚本