我要删除文件的顶部和最后一个非空行。
示例:
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。但是我想用一个命令来做。
答案 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