使用 bash 或 awk 替换字符串的一部分

Rob*_*ohn 0 bash awk

我的文件中有以下示例行:

sweet_25 2 0 4
guy_guy 2 4 6
ging_ging 0 0 3
moat_2 0 1 0
Run Code Online (Sandbox Code Playgroud)

我想处理该文件并得到以下输出:

sweet_25 2 0 4
guy 2 4 6
ging 0 0 3
moat_2 0 1 0
Run Code Online (Sandbox Code Playgroud)

请注意,所需的效果发生在第 2 行和第 3 行中 - 在出现此模式的行上,文本后面的下划线和文本被删除。

我没有成功执行以下操作:

sed -E 's/([a-zA-Z])_[a-zA-Z]/$1/g' file.txt >out.txt
Run Code Online (Sandbox Code Playgroud)

欢迎任何 bash 或 awk 的建议。谢谢

The*_*ird 5

如果要替换下划线之后的整个单词,则必须在替换中重复使用[a-zA-Z]+和使用字符类一次或多次。\1

sed -E 's/([a-zA-Z])_[a-zA-Z]+/\1/g' file.txt >out.txt
Run Code Online (Sandbox Code Playgroud)

如果下划线前后的单词应该相同,则可以使用带有反向引用的重复捕获组。

如果您只想对字符串的开头执行此操作,您可以^在模式前面加上/gsed 命令末尾的 。

sed -E 's/([a-zA-Z]+)(_\1)+/\1/g' file.txt >out.txt
Run Code Online (Sandbox Code Playgroud)

模式匹配:

  • ([a-zA-Z]+)捕获组 1,匹配 1 次或多次出现的字符 a-zA-Z
  • (_\1)+捕获组 2,重复匹配_和组 1 捕获的相同文本

文件out.txt将包含:

sweet_25 2 0 4
guy 2 4 6
ging 0 0 3
moat_2 0 1 0
Run Code Online (Sandbox Code Playgroud)