如何删除文件的顶部和最后非空行

时间:2019-10-15 10:17:33

标签: awk sed grep

我要删除文件的顶部和最后一个非空行。

示例:

cat test.txt

//blank_line
abc
def
xyz
//blank_line
qwe
mnp
//blank_line

然后输出应为:

def
xyz
//blank_line
qwe

我已经尝试过使用命令

sed "$(awk '/./{line=NR} END{print line}' test.txt)d" test.txt

删除最后一个非空行。在这里有两个命令,(1)sed和(2)awk。但是我想用一个命令来做。

5 个答案:

答案 0 :(得分:3)

这是一种双重通过方法:

{
    "from": 0,
    "size": 45,
    "query": {
        "bool": {
            "must": {
                "exists": {
                    "field": "ImageURL"
                }
            },
            "filter": [
                [{
                    "term": {
                        "PostStatusInd": 1
                    }
                }, {
                    "term": {
                        "PostCountry": "PAK"
                    }
                }], {
                    "range": {
                        "RecModDate": {
                            "gte": "2019-07-07 00:00:00"
                        }
                    }
                }, {
                    "range": {
                        "PostPriceAmt": {
                            "gte": "0",
                            "lte": "100000000"
                        }
                    }
                }, {
                    "geo_distance": {
                        "distance": "41000km",
                        "Location": {
                            "lat": "33.6895939",
                            "lon": "73.0435789"
                        }
                    }
                }
            ]
        }
    },
    "sort": [{
        "RecModDate": {
            "order": "desc"
        }
    }]
}

整数 awk '(NR==FNR) { if(NF) {t=FNR;if(!h) h=FNR}; next} (h<FNR && FNR<t)' file file h跟踪头部和尾部。在这种情况下,空行也可以包含空格。您可以将t替换为if(NF),以更加严格。

这将所有内容读入内存,并在最后进行简单替换:

if(length($0)==0)

答案 1 :(得分:3)

使用-E和-z的GNU sed一次读取内存中的整个文件:

Route::any('{any?}', function () {
    return view('index');
})->where('any','.*');

或使用GNU awk进行多字符RS:

$ sed -Ez 's/^\s*\S+\n//; s/\n\s*\S+\s*$/\n/' test.txt
def
xyz

qwe

两个GNU工具分别接受\ s和\ S作为[[:space:]]和[^ [:space:]]的简写,GNU sed接受非POSIX-sed-standard \ n作为换行符。

答案 2 :(得分:2)

使用缓冲区的单次通过,快速且内存效率相对较高的方法:

  "aggregations" : {
    "trx" : {
      "doc_count_error_upper_bound" : 0,
      "sum_other_doc_count" : 0,
      "buckets" : [
        {
          "key" : 3,
          "doc_count" : 2,
          "count" : {
            "value" : 2
          }
        }
      ]
    }
  }

答案 3 :(得分:0)

这是@kvantour解决方案的高尔夫版本

$ awk 'NR==(n=FNR){e=!NF?e:n;b=!b?e:b}b<n&&n<e' file{,}

答案 4 :(得分:0)

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

sed -E '0,/\S/d;H;$!d;x;s/.(.*)\n.*\S.*/\1/' file

使用一个范围删除最多包含第一行的空格(包括非空格字符)。然后将文件的剩余部分复制到保留空间中,并在文件末尾使用替换删除包含非空格字符的最后一行,并删除文件末尾的任何空行。

替代:

sed '0,/\S/d' file | tac | sed '0,/\S/d'| tac