在 Shell 中删除具有特定模式的行之后的行

MGM*_*MGM 15 command-line bash scripts text-processing

我正在尝试删除文件中特定模式之后的所有行。

我有很多文件,它们都具有相同的结构:

例子:

文件 1

line 1
...
line x "here there is a specific pattern"
...
EOF
Run Code Online (Sandbox Code Playgroud)

文件 n

line 1
...
line x "here there is a specific pattern"
...
EOF
Run Code Online (Sandbox Code Playgroud)

我试图找到一个简单的解决方案,但由于我有很多文件,所以我走了很长一段路:p

该模式在每个文件中出现一次。

所以,我得到了包含这个模式的所有行号,并保存在一个文件中。

这是我的代码:

count=$(ls -f path_to_folder/*.txt | wc -l)
echo "Number of txt file : $count"
###


    for ((i=1;i < $count+1 ;i++))

    {

    vt=$(grep -n PATTERN $i.txt | cut -d : -f 1)
    echo $vt >> PATTERN_line.txt

    }
Run Code Online (Sandbox Code Playgroud)

中的每一行都PATTERN_line.txt包含模式所在的每个文件中的行号。

现在,我正在尝试使用这些数字删除模式之后到文件结尾的所有行。

这意味着我需要将文件从头部保留到必须包含的模式行。

我感谢您的帮助

Zan*_*nna 21

这对于文本处理实用程序来说非常简单。例如,使用sed

sed '1,/pattern/!d' file
Run Code Online (Sandbox Code Playgroud)

意思是,匹配从第一行到第一行的每一行pattern并删除所有不匹配的行。因此,请替换pattern为您的模式。如果它包含/,则需要转义这些字符。例如,如果模式是pattern-with/character

sed '1,/pattern-with\/character/!d' file
Run Code Online (Sandbox Code Playgroud)

要实际编辑文件(而不是将编辑后的流打印到标准输出),您可以使用以下-i标志:

sed -i '1,/pattern/!d' file
Run Code Online (Sandbox Code Playgroud)

您可以通过将旧文件的扩展名添加到-i. 请注意这里 - 您不得在扩展名前包含空格。

sed -i.backup '1,/pattern/!d' file
Run Code Online (Sandbox Code Playgroud)

sed采用多个文件名参数。例如,要对当前目录中的所有非隐藏文件进行操作,您可以使用:

sed -i '1,/pattern/!d' *
Run Code Online (Sandbox Code Playgroud)

  • 我们怎样才能删除匹配的行呢? (2认同)