Regex 插入“;xyz";到以“开始”开头的行;abc";

Regex 插入“;xyz";到以“开始”开头的行;abc";,regex,shell,unix,sed,Regex,Shell,Unix,Sed,我不习惯在任何事情上使用sed,我也不确定这是否可行 我需要在文本文件中执行以下操作: 查找以“abc”开头的行 在所述行的“b”和“c”之间插入“xyz” 用新行替换原来的行 一个巨大的警告:如果没有以“abc”开头的行,我需要插入一行,并且必须在以“def”开头的行之前插入该行。(1)您问题的第一部分可以这样做: sed -i .bak 's/^abc/abxyzc/' input_file sed -i .bak 's/^def/NEW_LINE\ndef/' input_file (

我不习惯在任何事情上使用
sed
,我也不确定这是否可行

我需要在文本文件中执行以下操作:

  • 查找以“abc”开头的行
  • 在所述行的“b”和“c”之间插入“xyz”
  • 用新行替换原来的行
  • 一个巨大的警告:如果没有以“abc”开头的行,我需要插入一行,并且必须在以“def”开头的行之前插入该行。

    (1)您问题的第一部分可以这样做:

    sed -i .bak 's/^abc/abxyzc/' input_file
    
    sed -i .bak 's/^def/NEW_LINE\ndef/' input_file
    
    -i.bak
    用于就地编辑并创建扩展名为“.bak”的备份文件)

    (2) 第二部分,在另一行之前插入一行(不包括“abc”缺失的条件),可以这样做:

    sed -i .bak 's/^abc/abxyzc/' input_file
    
    sed -i .bak 's/^def/NEW_LINE\ndef/' input_file
    
    我认为你不能把“如果条件做(1)或者做(2)”作为一行。为此写一个简单的脚本…

    (1)问题的第一部分可以这样做:

    sed -i .bak 's/^abc/abxyzc/' input_file
    
    sed -i .bak 's/^def/NEW_LINE\ndef/' input_file
    
    -i.bak
    用于就地编辑并创建扩展名为“.bak”的备份文件)

    (2) 第二部分,在另一行之前插入一行(不包括“abc”缺失的条件),可以这样做:

    sed -i .bak 's/^abc/abxyzc/' input_file
    
    sed -i .bak 's/^def/NEW_LINE\ndef/' input_file
    

    我认为你不能把“如果条件做(1)或者做(2)”作为一行。为此编写一个简单的脚本…

    使用
    sed将有点复杂。如果您可以使用
    awk
    ,那么以下方法应该可以工作。这对文件执行两次传递。如果它找到
    /^abc/
    ,它会按你的要求做。如果未找到
    /^abc/
    ,则它将查找
    /def/
    ,并在其前面的一行插入
    xyz

    awk '
    NR==FNR && /^abc/{ 
        found = 1
        $0 = substr($0,0,2) "xyz" substr($0,3)
        lines[NR] = $0
        next
    }
    NR==FNR {
        lines[NR] = $0 
        next
    }
    !found && /^def/ {
        lines[FNR-1] = lines[FNR-1] "\nabc"
    }
    END {
        for(line=1; line<=FNR; line++) 
            print lines[line]
    }' file{,} > tmp && mv tmp file
    
    awk'
    NR==FNR&/^abc/{
    发现=1
    $0=substr($0,0,2)“xyz”substr($0,3)
    行[NR]=$0
    下一个
    }
    NR==FNR{
    行[NR]=$0
    下一个
    }
    !找到&&/^def/{
    行[FNR-1]=行[FNR-1]“\nabc”
    }
    结束{
    
    对于(line=1;linesed将有点复杂。如果您可以使用
    awk
    ,则以下操作应该有效。这会对文件执行两次传递。如果它找到
    /^abc/
    ,它会按您的要求执行。如果未找到
    /^abc/
    ,则它会查找
    /def/
    ,并在前面的一行插入
    xyz

    awk '
    NR==FNR && /^abc/{ 
        found = 1
        $0 = substr($0,0,2) "xyz" substr($0,3)
        lines[NR] = $0
        next
    }
    NR==FNR {
        lines[NR] = $0 
        next
    }
    !found && /^def/ {
        lines[FNR-1] = lines[FNR-1] "\nabc"
    }
    END {
        for(line=1; line<=FNR; line++) 
            print lines[line]
    }' file{,} > tmp && mv tmp file
    
    awk'
    NR==FNR&/^abc/{
    发现=1
    $0=substr($0,0,2)“xyz”substr($0,3)
    行[NR]=$0
    下一个
    }
    NR==FNR{
    行[NR]=$0
    下一个
    }
    !找到&&/^def/{
    行[FNR-1]=行[FNR-1]“\nabc”
    }
    结束{
    对于(行=1;行
    如果没有“abc”和“def”,我会在末尾打印修改后的“abc”行。您没有指定这种情况

    如果没有“abc”和“def”,我会在末尾打印修改后的“abc”行。您没有指定这种情况。

    这可能适用于您(GNU-sed):

    将文件拖到内存中。在行首的
    ab
    c
    之间替换
    xyz
    。如果执行此替换,则中断进一步处理。否则,在行首的
    def
    之前替换换行符。

    这可能对您有用(GNU-sed):


    将文件拖到内存中。在行首的
    ab
    c
    之间替换
    xyz
    。如果执行此替换,则中断进一步处理。否则,在行首的
    def
    之前替换换行符。

    到目前为止您是否尝试过任何代码?到目前为止您是否尝试过任何代码他的观点?出于好奇,你可以将
    文件文件
    更改为
    文件{,}
    @Jotne谢谢,修复了。出于好奇,你可以将
    文件
    更改为
    文件{,}
    @Jotne谢谢,修复了。