How can I delete all lines before a specific strin

2019-04-04 02:33发布

I have n files, like:

file1:

1aaa
2eee

Test        XXX
Hanna
Lars 

file2:

1fff
2ddd
3zzz

Test        XXX
Mike
Charly

I want to remove all rows before "Test XXX" from all n files. The number of rows to delete varies between files.

My idea:

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 shell sed
4条回答
2楼-- · 2019-04-04 03:03

This will work for your examples and even if the matched pattern is on the very first line:

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

For example if you input is simply

Test        XXX
Mike
Charly

This will give you

Mike
Charly

If you want to keep the first match Test XXX then just use:

sed -n -E -e '/Text XXX/,$ p' input.txt
查看更多
神经病院院长
3楼-- · 2019-04-04 03:17

This should work for you:

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

or simply

sed -i '1,/Test XXX/d' file*
查看更多
爷、活的狠高调
4楼-- · 2019-04-04 03:18

You can do it with bash ( eg for 1 file)

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

Use a for loop as necessary to go through all the files

查看更多
姐就是有狂的资本
5楼-- · 2019-04-04 03:20
cat <<-EOF > file1.txt
1aaa
2eee

Test        XXX
Hanna
Lars
EOF

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

Output:

Test        XXX
Hanna
Lars

Explanation:

  • -e '/Test *XXX/p' duplicates the line matching /Test *XXX/
  • -e '0,/Test *XXX/d' deletes from line 0 to the first line matching /Test *XXX/

By duplicating the line, then removing the first one, we effectively retain the matched line, successfully deleting all lines BEFORE Test XXX

Note: this will not work as expected if there are multiple Test XXX lines.

查看更多
登录 后发表回答