sed 删除匹配前的所有单词

nic*_*icg 7 sed text-processing

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

输入:

asd
asdd
asddd
STAC
asd
as
Run Code Online (Sandbox Code Playgroud)

输出:

STAC
asd
as
Run Code Online (Sandbox Code Playgroud)

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

Phi*_*pos 14

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

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

sed -i '/^STAC$/,$!d' myfile
Run Code Online (Sandbox Code Playgroud)

  • 也可能:`sed -ni '/^STAC$/,$p' myfile` (2认同)

Kus*_*nda 9

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

$ awk '/^STAC$/ { out=1 } out' file
STAC
asd
as
Run Code Online (Sandbox Code Playgroud)

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

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


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

awk 'p += /^STAC$/' file
Run Code Online (Sandbox Code Playgroud)

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

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


Jef*_*ler 7

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

printf '%s\n' '1,/^STAC/-1 d' 'wq' | ed -s myfile
Run Code Online (Sandbox Code Playgroud)

这将打印两个命令到ed

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

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


jes*_*e_b 3

使用awk

awk '/^STAC$/,/$ /' input
Run Code Online (Sandbox Code Playgroud)

这将打印 和 之间的所有行STAC(包括匹配行)


或者使用grep支持该-z选项的(BSD grep 不支持):

将输入和输出数据视为行序列,每行以零字节(ASCII NUL 字符)而不是换行符结尾。

grep -z 'STAC' input
Run Code Online (Sandbox Code Playgroud)