插入" xyz"以" abc"开头的一行

时间:2014-04-04 21:00:15

标签: regex shell unix sed

我不习惯使用sed进行任何操作,我不确定这是否可行。

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

  1. 找到以“abc”
  2. 开头的行
  3. 在“b”和所述行的“c”之间插入“xyz”
  4. 用新行替换原始行
  5. 一个巨大的警告:如果没有以“abc”开头的行,我需要插入一行,并且必须在以“def”开头的行之前插入。 / p>

4 个答案:

答案 0 :(得分:2)

(1)问题的第一部分可以像:

sed -i .bak 's/^abc/abxyzc/' input_file

-i .bak进行就地编辑,并创建一个扩展名为" .bak")的备份文件

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

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

我不认为你可以写"如果cond做(1)其他做(2)"作为单线。为此写一个简单的脚本......

答案 1 :(得分:2)

这可能适合你(GNU sed):

sed -r ':a;$!{N;ba};s/(^|\n)(ab)(c)/\1\2xyz\3/;t;s/(^|\n)(def)/\n\1\2/' file

将文件粘贴到内存中。在行的开头用xyzab之间替换c。如果进行这种替换,则进一步处理。否则,在行的开头def之前替换换行符。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

awk '
    /^def/ && !inserted {print "abxyzc"; forced = 1}
    /^abc/ && !forced   {sub(/^abc/,"abxyzc"); inserted = 1}
    1
    END {if ((!inserted) && (!forced)) print "abxyzc"}
' file > tmp && mv tmp file

如果没有&#34; abc&#34; no&#34; def&#34;,我打印修改过的&#34; abc&#34;最后一行。你没有指明这种情况。