我正在尝试删除前 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
当然,您可以使用grep
和sed
bash 算术扩展,例如:
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