Bash 如何从多个文件中删除特定字符串之前的所有行

Bash 如何从多个文件中删除特定字符串之前的所有行,bash,shell,sed,Bash,Shell,Sed,我有n个文件,如: 文件1: 1aaa 2eee Test XXX Hanna Lars 文件2: 1fff 2ddd 3zzz Test XXX Mike Charly 我想从所有n个文件中删除“Test XXX”之前的所有行。 要删除的行数因文件而异 我的想法是: for file in 1 :n do pos=grep -n "Test XXX" file$file sed -i "1:$pos-1 d" file$file >new$file

我有n个文件,如:

文件1:

1aaa
2eee

Test        XXX
Hanna
Lars 
文件2:

1fff
2ddd
3zzz

Test        XXX
Mike
Charly
我想从所有n个文件中删除“Test XXX”之前的所有行。 要删除的行数因文件而异

我的想法是:

for file in 1 :n
do
pos=grep -n "Test XXX" file$file
sed -i "1:$pos-1 d" file$file >new$file
done

您可以使用
bash
(例如对于1个文件)

t=0
而read-r行
做
[$line=~Test.*XXX]&&t=“1”
大写“$t”
1) 回音“$line”;;
以撒
完成tempo&&mv节奏文件

根据需要使用
for
循环浏览所有文件

这应该适用于您:

sed -i '1,/Test XXX/d' file1
sed -i '1,/Test XXX/d' file2
或者干脆

sed -i '1,/Test XXX/d' file*

这将适用于您的示例,即使匹配的模式位于第一行:

sed -n -E -e '/Text XXX/,$ p' input.txt | sed '1 d'
例如,如果您的输入是简单的

Test        XXX
Mike
Charly
这会给你

Mike
Charly
如果要保留第一个匹配项
测试XXX
,只需使用:

sed -n -E -e '/Text XXX/,$ p' input.txt
说明:

  • -e'/Test*XXX/p'
    复制匹配的行
    /Test*XXX/
  • -e'0,/Test*XXX/d'
    从第0行删除到匹配的第一行
    /Test*XXX/
通过复制行,然后删除第一行,我们有效地保留了匹配行,成功地删除了测试XXX之前的所有行


注意:如果有多个
Test XXX
行,这将无法像预期的那样工作。

问题是什么?似乎是重复的。小心这样做,您将丢失原始文件。这正是-i(内联)选项的目的。如果要同时创建备份文件,只需使用
-i.bak
。sed'1,/测试XXX/d'newfile这似乎回答了一个不同的问题;问题是如何删除特定行之前的行,不包括。我发现一个url说的是undocument-E(不过它似乎是一个ded链接;多亏了谷歌,它有web存储版本)。它与-r等价,后者与BSD兼容(请参阅该死链接页面中的代码段:
/*未记录,与BSD sed兼容。*/case“E”:case“r”:if(扩展的正则表达式标志)用法(4);extended_regexp_flags=REG_extended;break;…
该链接有时是可以的,因此我将在这里发布它的url:From the manual(
man sed
):
-E,-r,--regexp extended
在脚本中使用扩展正则表达式(为了便于移植,请使用POSIX-E).
还有
sed -n -E -e '/Text XXX/,$ p' input.txt
cat <<-EOF > file1.txt
1aaa
2eee

Test        XXX
Hanna
Lars
EOF

cat file1.txt | sed -e '/Test *XXX/p' -e '0,/Test *XXX/d'
Test        XXX
Hanna
Lars