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

Han*_*ans 15 bash shell sed

我有n个文件,比如:

文件1:

1aaa
2eee

Test        XXX
Hanna
Lars 
Run Code Online (Sandbox Code Playgroud)

文件2:

1fff
2ddd
3zzz

Test        XXX
Mike
Charly
Run Code Online (Sandbox Code Playgroud)

我想从所有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
Run Code Online (Sandbox Code Playgroud)

zta*_*013 21

这应该适合你:

sed -i '1,/Test XXX/d' file1
sed -i '1,/Test XXX/d' file2
Run Code Online (Sandbox Code Playgroud)

或者干脆

sed -i '1,/Test XXX/d' file*
Run Code Online (Sandbox Code Playgroud)

  • 如果要同时创建备份文件,只需使用`-i.bak`即可. (5认同)
  • 这似乎是在回答一个不同的问题; 问题是如何在特定行之前删除行,不包括. (4认同)
  • 小心这一点,你将丢失原始文件. (3认同)

Ale*_*son 6

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

sed -n -E -e '/Text XXX/,$ p' input.txt | sed '1 d'
Run Code Online (Sandbox Code Playgroud)

例如,如果输入简单

Test        XXX
Mike
Charly
Run Code Online (Sandbox Code Playgroud)

这会给你

Mike
Charly
Run Code Online (Sandbox Code Playgroud)

如果你想保留第一场比赛,Test XXX那么只需使用:

sed -n -E -e '/Text XXX/,$ p' input.txt
Run Code Online (Sandbox Code Playgroud)


bas*_*ist 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
Run Code Online (Sandbox Code Playgroud)

根据需要使用for循环来遍历所有文件