AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 552188
Accepted
Feriman
Feriman
Asked: 2019-11-15 07:04:08 +0800 CST2019-11-15 07:04:08 +0800 CST 2019-11-15 07:04:08 +0800 CST

如何从文件的开头和结尾删除空行?

  • 772

我想从文件的开头和结尾删除空行,但不删除中间非空行之间的空行。我认为sed或awk将是解决方案。

资源:

1:
2:
3:line1
4:
5:line2
6:
7:
8:

输出:

1:line1
2:
3:line2
text-processing
  • 10 10 个回答
  • 15357 Views

10 个回答

  • Voted
  1. Best Answer
    Stack EG
    2019-11-15T07:26:16+08:002019-11-15T07:26:16+08:00

    尝试这个,

    要从文件开头删除空行:

    sed -i '/./,$!d' filename
    

    要从文件末尾删除空行:

    sed -i -e :a -e '/^\n*$/{$d;N;ba' -e '}' file
    

    要从文件的开头和结尾删除空行:

    sed -i -e '/./,$!d' -e :a -e '/^\n*$/{$d;N;ba' -e '}' file
    

    从 man sed,

    -e script, --expression=script -> 将脚本添加到要执行的命令中

    b 标签 -> 分支到标签;如果省略标签,则跳转到脚本末尾。

    a -> 在一行之后附加文本(替代语法)。

    $ -> 匹配最后一行。

    n N -> 将换行符添加到模式空间,然后将下一行输入附加到模式空间。如果没有更多输入,则 sed 退出,不再处理任何命令。

    • 26
  2. glenn jackman
    2019-11-15T07:35:09+08:002019-11-15T07:35:09+08:00

    这个小 awk 程序将删除文件开头的空行:

    awk 'NF {p=1} p'
    

    所以我们可以将它与tac反转线结合起来并得到:

    awk 'NF {p=1} p' file | tac | awk 'NF {p=1} p' | tac
    
    line1
    
    line2
    

    窃取@guillermo chamorro 的命令替换技巧:

    awk 'NF {p=1} p' <<< "$(< file)"
    
    • 10
  3. Sundeep
    2019-11-15T07:16:32+08:002019-11-15T07:16:32+08:00

    如果文件小到足以满足内存要求:

    $ perl -0777 -pe 's/^\n+|\n\K\n+$//g' ip.txt
    line1
    
    line2
    
    • -0777啜食整个输入文件
    • ^\n+字符串开头的一个或多个换行符
    • \n\K防止删除最后一个非空行的换行符
    • \n+$字符串末尾的一个或多个换行符
    • 7
  4. schrodingerscatcuriosity
    2019-11-15T07:57:23+08:002019-11-15T07:57:23+08:00

    我提出这个:

    printf '%s\n' "$(cat file)" | sed '/./,$!d'
    

    它将打印除起始空白行之外的整个文本。因此,如果我们扩展示例:

    (blank)
    (blank)
    line1
    
    line2
    line1
    
    line2
    line1
    
    line2
    line1
    
    
    
    line2
    (blank)
    (blank)
    

    它将输出:

    line1
    
    line2
    line1
    
    line2
    line1
    
    line2
    line1
    
    
    
    
    line2
    
    • 6
  5. jubilatious1
    2021-07-19T21:16:07+08:002021-07-19T21:16:07+08:00

    使用 Raku(以前称为 Perl_6):

    如果使用 将文件读入 Raku lines,则可以巧妙地使用该 trim函数来清理文件开头和结尾的空白行(即空格):

    $ raku -e 'lines.join("\n").trim.put;' start_end.txt
    lineX
    line1
    
    line2
    line1
    
    line2
    line1
    
    line2
    line1
    
    
    
    line2
    ~$
    

    输入文件与@schrodigerscatcuriosity 使用的相同(文件开头有两个空行,文件末尾有两个空行)。如果您只需要清理文件的开头/结尾,那么trim-leading您trim-trailing就是您的朋友。

    或者,下面是 @Sundeep 的 Perl5 代码的非常简单的翻译,使用了一些 Raku 功能:

    raku -e 'S:g/ ^\n+ || \n+$ //.put given slurp;' start_end.txt
    

    对于 Perl5 到 Raku 的翻译:文件被slurp-ed in 并且 Raku 的S///非破坏性替换运算符用于返回结果字符串。交替是通过 Raku 的||“第一次匹配”交替运算符完成的,因为 Raku 的|交替运算符表示最长令牌匹配(LTM,一种改进)。

    Perl5/k和/或/K命令的 Raku 等价物很简单<( ... )>,可以单独使用或成对使用。这些运算符指示正则表达式引擎删除之前<(或之后的任何匹配项)>。[注意,然而,\KRaku 中的等价物对于手头的问题似乎是不必要的]。

    https://raku.org

    • 2
  6. Ed Morton
    2019-11-17T11:33:37+08:002019-11-17T11:33:37+08:00

    一个简单的两遍方法只是为了完整性:

    $ awk 'NR==FNR{if (NF) { if (!beg) beg=NR; end=NR } next} FNR>=beg && FNR<=end' file file
    line1
    
    line2
    

    以上将仅包含空白字符的行视为空行。相反,如果您只想将完全没有字符的行视为空行,则只需更改NF为/./.

    • 1
  7. markgraf
    2021-07-19T10:08:05+08:002021-07-19T10:08:05+08:00

    扩展@schrodigerscatcuriosity 命令替代技巧:

    cat <<< "$(tac <<< "$(tac file)")"
    

    我想shell-magics还有更多的空间。

    • 1
  8. nezabudka
    2021-07-21T05:40:31+08:002021-07-21T05:40:31+08:00

    GNU sed 对行长没有限制。

    sed -z 's/^\n*\|\n*$//g' file
    

    -zflag 告诉编辑器读取文本直到 NUL 字符分隔符,并且由于文件中没有这样的分隔符,它将整个文件读取为一行。

    但出于兼容性原因,建议将模式限制为不超过 4000 字节。还:

    递归用于处理子模式和无限重复。这意味着可用的堆栈空间可能会限制某些模式可以处理的缓冲区的大小。

    • 1
  9. Quasímodo
    2021-08-31T03:23:19+08:002021-08-31T03:23:19+08:00

    Ed和Ex是可以处理此任务的 POSIX 编辑器。

    它们非常相似,并且在此处介绍的解决方案 ed中ex可以 100% 互换1。

    一般解决方案

    printf '%s\n' a '' . 0a '' . '?.?+1,$d' '1,/./-1d' w q | ex -s file
    

    如果已知文件的开头和结尾有空行

    printf '%s\n' '?.?+1,$d' '1,/./-1d' w q | ex -s file
    

    如果您实际上是指空白2行

    printf '%s\n' a '' . 0a '' . '?[^[:blank:]]?+1,$d' '1,/[^[:blank:]]/-1d' w q | ex -s file
    

    解释和分解

    手册总是最好的解释,但这里有一个概述:

    Ed 和 Ex 总是从选择的最后一行开始——所以如果我们发出一个简单的d(删除命令),它会删除最后一行——它们可以查找匹配正则表达式的行。

    一些命令采用地址(“行号”),例如3,6d从第 3 行到第 6 行删除。

    • /regex/期待匹配“正则表达式”的第一行。
    • ?regex?在后面寻找匹配“regex”的第一行。

    你猜怎么着?正则表达式也可以是地址。

    # Insert an empty line at the end
    a
    
    .
    # Insert an empty line at the beginning
    0a
    
    .
    # Delete from line L1 up to line L2, where
    # L1 is the line below the last non-empty line: ?.?+1
    # L2 is the last line: $
    ?.?+1,$d
    # Delete from line L3 up to line L4, where
    # L3 is the first line: 1
    # L4 is the line above the first non-empty line: /./-1
    1,/./-1d
    # Write the changes to the file and quit
    w
    q
    

    为什么我们需要临时添加两个空行作为通用解决方案?因为否则1,/./-1d总是会删除第一行和 ?.?+1,$d最后一行,即使不是空的。

    1:但是 IIRC 一个干净的 Debian 安装缺少 Ed,所以我选择 Ex。
    2:即,视觉上是空的但可能包含空格和制表符的行。

    • 0
  10. Praveen Kumar BS
    2019-11-18T00:53:02+08:002019-11-18T00:53:02+08:00

    命令

    sed -n '/[a-zA-Z]/,/[a-zA-Z]/p' file| awk 'OFS=":"{$2=$1;$1=NR;print }'
    

    输出

    1 line1
    2 
    3 line2
    
    • -1

相关问题

  • grep 从 $START 到 $END 的一组行并且在 $MIDDLE 中包含匹配项

  • 重新排列字母并比较两个单词

  • 在awk中的两行之间减去相同的列

  • 多行文件洗牌

  • 如何更改字符大小写(从小到大,反之亦然)?同时[重复]

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    模块 i915 可能缺少固件 /lib/firmware/i915/*

    • 3 个回答
  • Marko Smith

    无法获取 jessie backports 存储库

    • 4 个回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    user12345 无法获取 jessie backports 存储库 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl 为什么大多数 systemd 示例都包含 WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve