我想删除某个模式之前的所有单词,例如:我想删除 之前的所有单词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 删除。