我不习惯使用sed
进行任何操作,我不确定这是否可行。
我需要在文本文件中执行以下操作:
一个巨大的警告:如果没有以“abc”开头的行,我需要插入一行,并且必须在以“def”开头的行之前插入。 / p>
答案 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
将文件粘贴到内存中。在行的开头用xyz
和ab
之间替换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;最后一行。你没有指明这种情况。