如何删除给定输入字符串的前 N-1 行

如何删除给定输入字符串的前 N-1 行

我正在尝试删除前 N-1 行直到指定字符串的第一个匹配项

我对脚本编写很陌生,但从我的谷歌搜索中我相信我有我需要的两个命令,但不知道如何一起使用它们:

grep -n -m 1 'STRING' file.txt |sed  's/\([0-9]*\).*/\1/'

给我 N 号线

sed -e '1,Nd' file.txt > file2.txt

将从 file.txt 中删除前 N 行并将其放置在 file2.txt 中

我可以使用'1,N-1d'?

此外,我怎样才能将上述所有内容放到一行中,因为我是从 ANSYS 执行的,并且它没有从一行到另一行传递参数

任何帮助将不胜感激

谢谢你!

答案1

您可以使用awk(默认版本mawk和 GNUgawk版本均可)通过单个命令来过滤文件:

awk '/STRING/{y=1} y' file1.txt > file2.txt

这里,/STRING/{y=1}扫描每个输入行以查找正则表达式模式STRING,如果匹配,则将变量设置y为 1。这里的名称和值都是任意选择的,我们只是将其用作布尔标志来记住我们是否已经看到您搜索的模式。

然后,对于每一行,在对该行执行第一次检查后,它会评估表达式y。 如果它是一个真值(例如这里的 1;而变量尚未定义,或者如果它是 0,那将是假的),则awk对该行执行默认操作,因为我们在表达式后没有指定任何内容,即仅打印该行。

这样,当我们的STRING模式第一次匹配时,变量就会被设置,并且此后的所有行(包括匹配的行本身)都会被打印,而之前的行则不会。

答案2

当然,您可以使用grepsedbash 算术扩展,例如:

N=$(grep -n -m1 'STRING' file1.txt | cut -d: -f1)
sed "1,$(( N - 1 ))d" file1.txt > file2.txt

您可以使用 获得相同的效果sed,例如:

sed '/STRING/!d; :a; n; ba' file1.txt > file2.txt

相关内容