【问题标题】:Searching for multiple lines including a blank one in shell script在 shell 脚本中搜索多行,包括一个空白行
【发布时间】:2012-04-01 21:55:19
【问题描述】:

我正在使用以下命令来查找跨越多行的模式并将其替换为空行:

sed -n '1h; 1!H; ${ g; s/<Pattern1>\n<pattern2> //g p }' <file-name>

例如,查找模式 约翰 能源部

在包含以下条目的文件 test.txt 中:

Mary

John
Doe
Simon
Henry

我会使用命令:

sed -n  '1h; 1!H; ${ g; s/John\nDoe //g p }' test.txt

但是,我似乎无法使此命令适用于第二行为空白的模式,即使用 ^$ 字符。

因此,如果我要搜索多行模式,Mary 后跟一个空行,我看不到任何匹配的模式。因此,以下命令不会导致搜索,因此不会进行替换。

sed -n  '1h; 1!H; ${ g; s/Mary\n^$ //g p }' test.txt

有什么想法吗?

编辑


但是,如果我将多个这样的命令存储在一个文件中并执行它们,那么第一次搜索可以正常进行,但是在搜索后续模式时,我会从 sed 得到一个空白输出。

如果我存储,sed -n '1h; 1!H; ${克; s/\n //g p }' sed -n '1h; 1!H; ${克; s/\n //gp }' 在一个文件中然后使用eval关键字执行这个文件中的每一行,然后第一个sed替换第一个多行模式,即pattern1,然后是pattern2,但是,它返回一个即使文件包含这些模式,也会出现空白输出。有什么线索吗?

【问题讨论】:

    标签: shell sed pattern-matching


    【解决方案1】:

    这可能对你有用:

    sed '$!N;s/John\nDoe//;P;D' file
    Mary
    
    
    Simon
    Henry
    sed '$!N;s/Mary\n$//;P;D' file
    
    John
    Doe
    Simon
    Henry
    

    注意^ 指的是字符串的开始而不是行的开始(除非在 GNU sed 中你使用m 标志)。同样$ 表示字符串的结尾。

    编辑:

    以上两个命令可以组合使用:

    sed '$!N;s/John\nDoe//;s/Mary\n$//;P;D' file
    
    
    Simon
    Henry
    

    【讨论】:

    • 但是,如果我将多个这样的命令存储在一个文件中并执行它们,那么第一次搜索会很好,但是在搜索后续模式时,我会从 sed 得到一个空白输出。也就是说,如果我存储 sed -n '1h; 1!H; ${克; s/\n //g p }' sed -n '1h; 1!H; ${克; s/\n //gp }' 在一个文件中然后使用eval关键字执行这个文件中的每一行,然后第一个sed替换第一个多行模式,即pattern1,然后是pattern2,但是,它返回一个即使文件包含这些模式,也会出现空白输出。有什么线索吗?
    【解决方案2】:

    这适用于您的输入文件:

    sed -n  '1h; 1!H; ${ g; s/Mary\n\n/\n/g p }'
    

    解释:

    Mary\n\n                # Mary with two consecutive newlines, the first one is automatically added by
                            # the 'H' command, and the next one means the empty line, asumming it has no
                            # spaces.
    \n                      # Substitute it with a blank line.
    

    【讨论】:

    • 但是,如果我将多个这样的命令存储在一个文件中并执行它们,那么第一次搜索会很好,但是在搜索后续模式时,我会从 sed 得到一个空白输出。也就是说,如果我存储 sed -n '1h; 1!H; ${克; s/\n //g p }' sed -n '1h; 1!H; ${克; s/\n //gp }' 在一个文件中然后使用eval关键字执行这个文件中的每一行,然后第一个sed替换第一个多行模式,即pattern1,然后是pattern2,但是,它返回一个即使文件包含这些模式,也会出现空白输出。有什么线索吗?
    猜你喜欢
    • 1970-01-01
    • 2013-04-18
    • 2021-06-03
    • 1970-01-01
    • 2012-05-28
    • 2021-02-14
    • 1970-01-01
    • 2021-12-27
    • 2023-03-23
    相关资源
    最近更新 更多