我有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
答案 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
行,则无法按预期工作。