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)
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$/
字符串比较而不是正则表达式匹配。
另一种选择是使用可编写脚本的编辑器,例如ed
:
printf '%s\n' '1,/^STAC/-1 d' 'wq' | ed -s myfile
Run Code Online (Sandbox Code Playgroud)
这将打印两个命令到ed
:
STAC
)该-s
选项禁止ed
默认打印读取和写入的字节数。
使用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)