我有一个具有如下模式的文件:
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
它将删除每行开头的所有内容,包括破折号。除此之外,在没有破折号的行上,正则表达式将不匹配,因此它不会执行任何替换并将行保持原样。
如果您想要的是仅在每隔一行应用一次转换,那么您可以使用命令sed
(n
表示“下一个”)跳过一行,但仍将其发送到输出。
这假设您确实想对偶数行进行操作(在您的示例中,块之间有空白行,我假设这些是复制和粘贴工件,并且您的问题标题“备用行”实际上是您想要的。 )
此命令将仅将正则表达式应用于偶数行:
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