我的文件中有以下示例行:
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 的建议。谢谢
如果要替换下划线之后的整个单词,则必须在替换中重复使用[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)