使用sed删除所有块中的特定行值

时间:2018-06-03 17:36:56

标签: sed

在每个块中仅删除第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}

4 个答案:

答案 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 关闭自动打印。关注-nstart分隔符之间的行。如果当前行是end分隔符,则将计数器重置为空。打印第五行和第六行以外的所有行,不要忘记累加计数器。打印所有其他行。