sed 删除匹配项之前的所有单词

sed 删除匹配项之前的所有单词

我想删除某个模式之前的所有单词,例如:我想删除 之前的所有单词STAC

输入:

asd
asdd
asddd
STAC
asd
as

输出:

STAC
asd
as

我有这个代码sed -ni "s/^.*STAC//d" myfile

答案1

sed按行工作,这就是为什么你的尝试不起作用。

那么如何做到这一点呢sed?定义一个地址范围,从STAC行 ( /^STAC$/) 开始到文件末尾 ( $)。这些应该被打印,所以其他所有内容 ( !) 都应该被d删除:

sed -i '/^STAC$/,$!d' myfile

答案2

awk打印匹配后所有行(包括匹配)的变体:

$ awk '/^STAC$/ { out=1 } out' file
STAC
asd
as

这与仅包含字符串的行匹配STAC并设置out为非零值。为了每个行,如果out非零,则打印它。

使用$0 == "STAC"代替来/^STAC$/进行字符串比较而不是正则表达式匹配。


稍微更混乱但更短,使用正则表达式匹配的布尔结果作为整数(不匹配为 0,匹配为 1):

awk 'p += /^STAC$/' file

如果结果p非零(即从正则表达式第一次匹配的点开始),则将打印当前行。

使用p += ($0 == "STAC")代替来p += /^STAC$/进行字符串比较而不是正则表达式匹配。

答案3

另一种选择是使用可编写脚本的编辑器,例如ed

printf '%s\n' '1,/^STAC/-1 d' 'wq' | ed -s myfile

这会打印两个命令ed

  • 删除从 1 到 的行(以 开头的行之前的行STAC
  • 将文件写回磁盘并退出

-s选项禁止ed默认打印读取和写入的字节数。

答案4

grep -wn STAC file.txt | cut -d":" -f 1 | xargs -I % sed '1,%d' file.txt

获取单词的行号,将其传递给 xargs 并使用 sed 删除。

相关内容