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 / 问题 / 563973
Accepted
Harold Fischer
Harold Fischer
Asked: 2020-01-25 14:18:40 +0800 CST2020-01-25 14:18:40 +0800 CST 2020-01-25 14:18:40 +0800 CST

为什么我必须在用换行符替换空格后再次调用 sed?

  • 772

给定一个文件,我想以八进制格式列出它包含的所有字节,每个字节在自己的行中。

为什么会这样:

#!/bin/sh --

newline='
'

od -v -A n -t o1 -- /tmp/file | \
sed -e "s/ /\\${newline}/g" | \
sed -e '/^$/d'

而不是这个:

#!/bin/sh --

newline='
'

od -v -A n -t o1 -- /tmp/file | \
sed -e "s/ /\\${newline}/g" -e '/^$/d'

为什么我必须两次分别调用 sed 才能完成工作?

作为参考, 的输出od,未经进一步处理,可能类似于以下内容:

         047 124 167 141 163 040 142 162 151 154 154 151 147 054 040 141
         156 144 040 164 150 145 040 163 154 151 164 150 171 040 164 157
         166 145 163 012 011 104 151 144 040 147 171 162 145 040 141 156
         144 040 147 151 155 142 154 145 040 151 156 040 164 150 145 040
         167 141 142 145 072 012 101 154 154 040 155 151 155 163 171 040
         167 145 162 145 040 164 150 145 040 142 157 162 157 147 157 166
         145 163 054 012 011 101 156 144 040 164 150 145 040 155 157 155
         145 040 162 141 164 150 163 040 157 165 164 147 162 141 142 145
         056 012
sed posix
  • 2 2 个回答
  • 102 Views

2 个回答

  • Voted
  1. Best Answer
    Kusalananda
    2020-01-25T14:31:40+08:002020-01-25T14:31:40+08:00

    每个sed表达式都作用于整个模式空间。在循环开始时,将一行读入模式空间,然后sed将每个给定表达式应用于该数据。

    在您的代码的第二个变体中,您使用替换将换行符插入到模式空间中。第二个表达式 ,/^$/d仍将作为一个整体作用于模式空间,而不是作用于模式空间中的每一行,这意味着模式将不匹配(因为缓冲区非空),并且模式空间不会被删除。更改/^$/d为s/\n\{2,\}//g将删除两个或多个连续换行符的任何运行(这些将在输出中创建空行),这将起作用。

    这与代码的第一个变体形成对比,第二个变体sed读取第一个的输出sed。在这种情况下,第二个将单独sed读取每个生成的行,并删除那些为空的行。

    简而言之:在模式空间中添加换行符不会sed重新考虑每个生成的行作为剩余表达式的单独输入。


    另一种解决方案:

    od -v -A n -t o1 -- /tmp/file |
    sed -e 's/ \{2,\}//g' -e 'y/ /\n/'
    

    第一个sed表达式,s/ \{2,\}//g去掉任何两个或多个连续空格的运行,然后第二个表达式将剩余的空格转换为换行符(命令\n允许y,即使在 POSIX 中也是如此sed)。

    或者,您可以在将所有剩余空格转换为换行符之前删除所有侧翼空格:

    od -v -A n -t o1 -- /tmp/file |
    sed -e 's/^ *//' -e '$s/ *$//' -e 'y/ /\n/'
    

    (请注意,只有输出的最后一行od可能有尾随空格,这就是为什么我将$其用作第二个表达式的地址。)

    或者,它可能更直接awk:

    od -v -A n -t o1 -- /tmp/file |
    awk '{ for (i = 1; i <= NF; ++i) print $i }'
    
    • 4
  2. RudiC
    2020-01-25T14:36:18+08:002020-01-25T14:36:18+08:00

    这是因为空行仅存在于输出文件中,在进行替换之后。为什么不

    od -v -An -to1 -w1 -- file 
    

    ?

    • 0

相关问题

  • Linux grep文件1中的内容在文件2中[重复]

  • 如何在第三个逗号后用条件grep行

  • 根据第一个逗号之前的匹配删除重复行数

  • 如何改进这个字符转换脚本?

  • 如何删除两行之间的单行

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