SED 为下一个 block /命令保留模式 in\1

标签 sed

我想匹配一个模式,但用匹配的模式替换其他东西。

pattern1    X1 X2 X3
pattern2    X4 X5
...

应该转化为

pattern1-1
pattern1-2
pattern1-3

pattern2-4
pattern2-5

...

我不能只替换“X”,因为它连续多次出现。

我试过 sed -r '/(pattern[0-9])/{ s/X/\n\1/g; }' 但这会给我一个 invalid reference\1 on `s 错误。

还有其他方法吗?

最佳答案

这可能对你有用(GNU sed):

sed -E 's/(\S+)\s+X(\S+)/\1-\2\n\1/;/-/!s/.*//;P;D' file

使用模式匹配来匹配第一个字段和另一个以 X 开头的字段。操作到所需的结果,然后再次附加换行符和第一个字段。打印/删除直到并包括第一个换行符,如果一行与删除不匹配,则其内容即打印一个空行。

如果不需要空行,使用:

sed -E 's/(\S+)\s+X(\S+)/\1-\2\n\1/;/-/P;D' file

关于SED 为下一个 block /命令保留模式 in\1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59820385/

相关文章:

awk - 如果在 Linux 中仅匹配特定值,如何打印列?

bash - sed问题:-bash:意外 token `('附近的语法错误

bash - sed 模式匹配不起作用

mysql - 使用 tr 或 sed 为 MySQL 输入准备字符串

unix - UNIX 中具有相似文件名的重复文件

Bash - 根据特定行上的文本匹配删除奇数/偶数行

linux - 删除包含下一行子字符串的几乎重复项

bash - 删除输入列表的可变部分

sed - 如何正确对齐文件中的列

php - 如何使用 PHP 执行 sed -i '/^MAIL_DRIVER=/s/=.*/=log/' .env 之类的内容来更新 Laravel dotenv 文件中的变量值