在每个块中仅删除第4个和第5个值(第1个块中的第1个和第5个,第2个块中的第4个和第5个,第3个块中的第4个和第3个)。
尝试了这个sed -E -e :a -e 's/(.*) ( .*$)/\1 \4 \5/; ta'
而没有工作。
{content-start}
first1
second1
third1
fourth1
fifth1
sixth1
{content-end}
{content-start}
first2
second2
third2
fourth2
fifth2
sixth2
{content-end}
{content-start}
first3
second3
third3
fourth3
fifth3
sixth3
{content-end}
答案 0 :(得分:1)
说真的,忘了尝试在个别行上使用sed而不仅仅是s / old / new。对于其他任何事情,awk解决方案将总是更清晰,更简单,更高效,更易于增强/维护,并且比同一任务的sed解决方案更便携。
这只是建立在my previous awk script:
之上$ cat tst.awk
BEGIN { badLineNrs[5]; badLineNrs[6] }
{ rec[++numLines] = $0 }
/{content-end}/ {
for (lineNr=1; lineNr<=numLines; lineNr++) {
if ( !(lineNr in badLineNrs) ) {
print rec[lineNr]
}
}
delete rec
numLines = 0
}
$ awk -f tst.awk file
{content-start}
first1
second1
third1
sixth1
{content-end}
{content-start}
first2
second2
third2
sixth2
{content-end}
{content-start}
first3
second3
third3
sixth3
{content-end}
或者如果你喜欢简短而神秘的话,这也会产生使用任何awk的预期输出,但它更难以构建并执行诸如打印或跳过特定记录(如your previous question)之类的事情,所以除了可移植性之外没有比同等的sed解决方案好多了:
$ awk '(NR-5)%8 && (NR-6)%8' file
{content-start}
first1
second1
third1
sixth1
{content-end}
{content-start}
first2
second2
third2
sixth2
{content-end}
{content-start}
first3
second3
third3
sixth3
{content-end}
答案 1 :(得分:0)
关注awk
也可能有所帮助。
awk '
/^{content-start}/{
flag=1;
print;
next}
flag{
count++}
flag && ((count==4) || (count==5)){
next}
flag;
/^{content-end}/{
flag=count=""}
' Input_file
答案 2 :(得分:0)
心理练习的sed
sed -E 'N;N;N;N;N;N;N;s/(([^\n]*\n){4})([^\n]*\n){2}(.*)/\1\4/' infile
答案 3 :(得分:0)
这可能对您有用(GNU sed):
function expandKeys($arr) {
$result = [];
foreach($arr as $key => $value) {
if (is_array($value)) $value = expandKeys($value);
foreach(array_reverse(explode(".", $key)) as $key) $value = [$key => $value];
$result = array_merge_recursive($result, $value);
}
return $result;
}
通过设置选项sed -n '/start/,/end/{/start/{x;s/.*//;x};x;/^x\{4,5\}$/!{x;p;x};s/^/x/;x;b};p' file
关闭自动打印。关注-n
和start
分隔符之间的行。如果当前行是end
分隔符,则将计数器重置为空。打印第五行和第六行以外的所有行,不要忘记累加计数器。打印所有其他行。