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

发布于 2024-12-04 13:14:07 字数 380 浏览 1 评论 0原文

我有 n 个文件,例如:

file1:

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

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

太阳哥哥 2024-12-11 13:14:07

这应该对你有用:

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

或者简单地

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

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*
允世 2024-12-11 13:14:07

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

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

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
你的背包 2024-12-11 13:14:07

您可以使用 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 循环来遍历所有文件

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

天生の放荡 2024-12-11 13:14:07
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/

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

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

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.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文