在备用行中使用 sed

在备用行中使用 sed

我有一个具有如下模式的文件:

12345.ABC9998
12345555.abc:ffr.abc-MKDHJKSJJDOKSOKSDCKJODCKJ

12345.ABC9998
12345555.abc:ffr.abc-MKDHJKSJJDOKSOKSDCKJODCKJ

我想删除破折号之前的所有内容,并包括第二行中每一行的破折号本身。

期望输出:

12345.ABC9998
MKDHJKSJJDOKSOKSDCKJODCKJ

12345.ABC9998
MKDHJKSJJDOKSOKSDCKJODCKJ

我知道sed 's/^[^A-Z]*//' file.txt可以做到这一点,但它适用于每一行。如何编辑它以仅在我想要的行(每隔一行)上工作?

答案1

如果您只想对包含破折号的行进行操作(在您的示例中,似乎就是这种情况),那么这应该可行:

sed 's/^.*-//' file.txt

它将删除每行开头的所有内容,包括破折号。除此之外,在没有破折号的行上,正则表达式将不匹配,因此它不会执行任何替换并将行保持原样。


如果您想要的是仅在每隔一行应用一次转换,那么您可以使用命令sedn表示“下一个”)跳过一行,但仍将其发送到输出。

这假设您确实想对偶数行进行操作(在您的示例中,块之间有空白行,我假设这些是复制和粘贴工件,并且您的问题标题“备用行”实际上是您想要的。 )

此命令将仅将正则表达式应用于偶数行:

sed 'n;s/^[^A-Z]*//' file.txt

答案2

这将删除每第二行中直到破折号的所有内容:

sed '0~2s/.*-//' infile

如果您的意思是从该行之后的行中删除第二行12345.ABC9998,那么您会这样做:

sed '/^12345.ABC9998$/{n; s/.*-//}' infile

如果您的意思是删除包含字符串的行之后的第二行12345.ABC9998,您可以这样做:

sed '/12345.ABC9998/{n; s/.*-//}' infile

答案3

或者,可以命令它删除每隔一行的大写字母之前的所有内容。这样,破折号之前的任何内容以及破折号本身都可以相应地被删除。

sed -i '0~2s/[^A-Z]*//' file

相关内容