【问题标题】:Using sed between specific lines only仅在特定行之间使用 sed
【发布时间】:2013-04-18 15:33:18
【问题描述】:

我有这个 sed 命令用于删除逗号后的空格。

 sed -e 's/,\s\+/,/g' example.txt

我怎样才能改变它,它只会在特定的行号之间进行修改。

(例如在第二行和第三行之间)。

【问题讨论】:

  • 在调用 sed 时是否知道这些特定的行号,或者文件中的某些区域依赖于数据本身?就像 sed 应该只在某些开始和结束标记之间有效?在那种情况下,我会使用awk,因为您可以在行之间保留状态变量。

标签: regex unix sed


【解决方案1】:

用途:

sed '2,3s/,\s\+/,/g' example.txt

【讨论】:

    【解决方案2】:

    由于 OSX (BSD sed) 与 linux (GNU) sed 有一些语法差异,所以我想从我的一些来之不易的笔记中添加以下内容:

    OSX (BSD) SED 在同一文件 (via & via & via & 部分的 (地址) 块 (起点和终点模式 (/../) 或行 #s) 内查找/替换4.20here):

    语法:

    $ sed '/start_pattern/,/end_pattern/ [operations]' [target filename]
    

    标准查找/替换示例:

    $ sed -i '' '2,3 s/,\s\+/,/g' example.txt
    $ sed -i '' '/DOCTYPE/,/body/ s/,\s\+/,/g' example.txt
    

    使用复杂的运算符和分组查找/替换示例(由于标准输入的流使用,无法在没有分组语法的情况下进行操作)。分组中的所有语句必须在单独的行上,或用分号分隔:

    复杂运算符示例(将删除包含匹配项的整行):

    $ sed -i '' '2,3 {/pattern/d;}' example.txt
    

    多文件查找+sed:

    $ find ./ -type f -name '*.html' | xargs sed -i '' '/<head>/,/<\/head>/ {/pattern/d; /pattern2/d;}'
    

    希望这对某人有所帮助!

    【讨论】:

      【解决方案3】:
      sed -e '2,3!b;s/,\s\+/,/g' example.txt
      

      如果您以后想要添加更多命令来处理所需的行,此版本会很有用。

      【讨论】:

      • 我怀疑这里有很好的信息。但我不得不承认,我不关注正在发生的事情。对我来说,为什么 !b; 存在以及它们以后如何有用对我来说并不明显。也许你可以解释一下。
      猜你喜欢
      • 2021-12-30
      • 1970-01-01
      • 1970-01-01
      • 2018-04-07
      • 2020-08-08
      • 2017-12-22
      • 1970-01-01
      • 2017-10-13
      • 1970-01-01
      相关资源
      最近更新 更多