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 / 问题 / 724006
Accepted
AeroMaxx
AeroMaxx
Asked: 2022-11-08 11:07:33 +0800 CST2022-11-08 11:07:33 +0800 CST 2022-11-08 11:07:33 +0800 CST

如何从文本文件中删除视觉上的空行?

  • 772

我有一堆文本文件,其中一些包含空行,即仅包含换行符,或者可能的空格后跟换行符。我使用find命令定位文件。

  • 示例文件
    #Title 1
    12345678 1234
    
    #Title 2
    12345678 1234
    12345678 1234
    
    
    
    
    
    
    
    
  • 预期产出
    #Title 1
    12345678 1234
    #Title 2
    12345678 1234
    12345678 1234
    

我想删除所有这些空行。我在 Debian Linux Stretch 上使用以下命令进行了尝试:

cat "/path/to/file" | sed '/^\s*$/d' | sponge "/path/to/file";

例如,某些文件有 4 个或更多尾随空行,但上述命令仅删除了除一个尾随空行之外的所有文件。

我怎样才能删除最后一个尾随空行?如前所述:如果文件中还有任何空行,那么这些也应该被删除。

我试图在文件之间获得一些一致性,因为文件存储在 BASH 变量中的排序数组中。然后循环文件并删除所有空行和尾随空行,而某些文件已经没有空行或任何尾随空行。

bash
  • 6 6 个回答
  • 129 Views

6 个回答

  • Voted
  1. AdminBee
    2022-11-09T01:13:30+08:002022-11-09T01:13:30+08:00

    如果我正确理解您的问题,您想从文本文件中删除(真正或视觉上的)空行。这可以很容易地使用awk.

    对于单个文件,您可以调用

    awk 'NF' /path/to/file
    

    这将只打印行上至少有一个“非空白”字符的文件。这背后的想法是awk默认情况下将输入行拆分为“空白”处的“字段”,即空格和制表符的连续运行。但是,如果一行仅包含此类字符,则内部存储在自动变量中的字段数NF将被识别为“零”。上面的(相当短的)程序强加了NF必须为非零的条件才能打印当前行。这有效地删除了真正或“视觉上”的空行。

    由于awk默认情况下不会执行内联编辑,您可能不得不求助于将输出重定向到临时文件然后重命名,或者使用理解-i inplace扩展的足够新的实现:

    awk -i inplace 'NF' /path/to/file
    
    • 5
  2. roaima
    2022-11-09T23:00:10+08:002022-11-09T23:00:10+08:00

    这是另一种可移植的方法,它只包含包含空格以外的内容的行:

    grep '[^[:space:]]' file
    

    您也可以对其他命令使用相同的方法:

    sed -n '/[^[:space:]]/p' file
    

    写入与源相同的文件是一个相当标准的过程。一些命令使用-i(或等效的)来指示就地编辑,但实际上它们实际上写入临时文件,然后用临时文件覆盖原始文件:

    some_command file >file.tmp && mv -f file.tmp file
    rm -f file.tmp
    

    file如果没有来自其他地方的硬链接,那效果很好。为了满足这种情况,您需要一个副本:

    some_command file >file.tmp && cat file.tmp >file
    rm -f file.tmp
    
    • 3
  3. Best Answer
    Kusalananda
    2022-11-09T00:12:43+08:002022-11-09T00:12:43+08:00

    不幸的是,我只能在 macOS 上重现您的问题,其中sed理解\s为s. 因此,该模式^\s*$将匹配由零个或多个s字符组成的任何行。这包括空行,但不包括仅包含类似空格字符的行。


    删除空行或仅包含空格或制表符的可移植方法是

    grep -v -x '[[:blank:]]*' file
    

    这用于grep仅提取不匹配的行[[:blank:]]*。该[[:blank:]]*模式匹配零个或多个空格或制表符。如果你想匹配更多类似空格的字符(包括回车和垂直制表符),请[[:space:]]*改用。强制模式匹配完整行的-x选项grep(就像您使用^and锚定了表达式一样$)。

    • 2
  4. aviro
    2022-11-09T00:36:24+08:002022-11-09T00:36:24+08:00

    您可以将 替换\s为[[:space:]]。此外,大多数sed版本都有一个-i标志,表示就地编辑文件。所以这个命令应该工作:

    sed -i '/^[[:space:]]*$/d' /path/to/file
    
    • 1
  5. ilkkachu
    2022-11-10T09:48:38+08:002022-11-10T09:48:38+08:00

    在使用 GNU 工具的系统上进行测试;这里,%是 shell 提示符,而$行尾标记由cat -A:

    % printf 'foo\n   \nbar\n   \n    \n' > file.txt
    % cat -A file.txt
    foo$
       $
    bar$
       $
        $
    % cat file.txt | sed '/^\s*$/d' | sponge file.txt
    % cat file.txt  
    foo
    bar
    %
    

    结果文件的末尾没有空行。

    一些编辑器允许将光标移动到最后一行下方以更容易在末尾添加新行这一事实与该 sed 命令如何删除明显空的行无关。

    (而不是带有 的管道sponge,您可以只使用sed -i '/^\s*$/d' file.txt,但您可能应该使用[[:space:]]*而不是\s*更广泛支持的管道。)

    • 0
  6. Stéphane Chazelas
    2022-11-10T09:59:38+08:002022-11-10T09:59:38+08:00

    你可以使用:

    grep '[[:graph:]]'
    

    它将报告包含至少一个图形字符的行,因此不包括空行或仅包含空白字符、控制字符、未知/未定义/无效字符的行。

    • 0

相关问题

  • 通过命令的标准输出以编程方式导出环境变量[重复]

  • 从文本文件传递变量的奇怪问题

  • 虽然行读取保持转义空间?

  • `tee` 和 `bash` 进程替换顺序

  • 运行一个非常慢的脚本直到它成功

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