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

时间:2011-09-14 13:16:37

标签: bash shell sed

我有n个文件,例如:

文件1:

1aaa
2eee

Test        XXX
Hanna
Lars 

file2的:

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

4 个答案:

答案 0 :(得分:21)

这应该适合你:

sed -i '1,/Test XXX/d' file1
sed -i '1,/Test XXX/d' file2

或只是

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

答案 1 :(得分:6)

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

sed -n -E -e '/Text XXX/,$ p' input.txt | sed '1 d'

例如,如果您输入的只是

Test        XXX
Mike
Charly

这会给你

Mike
Charly

如果您想保留第一场比赛Test XXX,请使用:

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

答案 2 :(得分:1)

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

t=0
while read -r line
do
    [[ $line =~ Test.*XXX ]] && t="1"
    case "$t" in
     1) echo "$line";;
    esac
done < file > tempo && mv tempo file

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

答案 3 :(得分:1)

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

说明:

  • -e '/Test *XXX/p'重复与/Test *XXX/
  • 相匹配的行
  • -e '0,/Test *XXX/d'从第0行删除到与/Test *XXX/
  • 匹配的第一行

通过复制该行,然后删除第一行,我们有效地保留匹配的行,成功删除所有行Test XXX

注意:如果有多个Test XXX行,则无法按预期工作。