【问题标题】:Sed print only lines with at least 2 wordsSed 仅打印至少包含 2 个单词的行
【发布时间】:2018-01-22 18:43:35
【问题描述】:

您好,我正在尝试仅使用简单的 sed 命令编写代码。 这是我的问题:

我想打印文件中的某些行,这些是条件:

-仅当该行至少有 2 个单词时

-仅当第二个单词至少有 3 个字符时

-在满足上述条件后,必须定期打印行,除了行中的第二个单词,其前 3 个字符必须加倍。 编辑:

这部分可以在 AWK 中完成

-在最后一行中,它必须打印原始文件中未包含的行数

例子:

abc2 1 def2 3 abc2
dea 123 123 zy45
12 12
abc cd abc cd
xyz%$@! x@yz%$@! kk
xyzxyz
abc htzw 

输出:

dea 112233 123 zy45
xyz%$@! xx@@yyz%$@! kk
abc hhttzzw
4

这是我当前的代码:

sed -r '/[ ]*([^ ]+[ ]){2,}/!d' ex >| tmp
sed -r '/[ ]*[^ ]+[ ][^ ]{3,}/!d' tmp >| tmp2
sed -r 's/([ ]*[^ }+[ ])([^ ])([^ ])([^ ])(*)/\1 \2 \2 \3 \3 \4 \4 \5/' tmp2 
>| tmp

但我似乎遇到了一个我无法修复的错误,我不知道如何打印数字 4(参见示例)。

错误:

sed: -e expression #1, char 62: Invalid preceding regular expression

任何帮助都会很棒:)

【问题讨论】:

  • 你的例子中没有单4。单“4”是从哪里来的?
  • 一开始有 7 行,但在输出中只有 3、7-3。 4 表示开头和不在输出中的行数@Cyrus
  • 您需要为此使用sed 吗?使用awk 会容易得多。
  • 是的,我需要在 sed @PesaThe 中编写它
  • 这是学校作业吗?如果是这样的话,我会为教练选择几句话;)

标签: bash shell unix sed


【解决方案1】:

你可以试试这个(sed + bash)

nb=$(sed -n '$=' infile)
sed -E '
  /([^ ]* )([^[:space:]]*)(.*)/h
  s//\2/
  tA
  d
  :A
  s/([^[:space:]])([^[:space:]])([^[:space:]])(.*)/\1\1\2\2\3\3\4/
  tB
  d
  :B
  G
  s/(.*)\n([^ ]* )([^[:space:]]*)(.*)/\2\1\4/
' infile > infilebis
cat infilebis
echo $(($nb - $(sed -n '$=' infilebis)))
rm infilebis

【讨论】:

    【解决方案2】:

    您的任务的第一部分可以使用 GNU sed 完成:

    sed -rn 's/^([^ ]+ )([^ ])([^ ])([^ ])/\1\2\2\3\3\4\4/; T; p' input.txt
    

    T 标签 - 如果没有 s/// 自从最后一个输入行被读取并且自 最后一个 t 或 T 命令,然后分支到标签;如果省略标签,则跳转到脚本末尾。 这是一个 GNU 扩展。

    输出

    dea 112233 123 zy45
    xyz%$@! xx@@yyz%$@! kk
    abc hhttzzw
    

    不包含行数的版本

    #!/bin/bash
    
    sed -rn '
        s/^([^ ]+ )([^ ])([^ ])([^ ])/\1\2\2\3\3\4\4/
        T branch
        p; d
        :branch
        w not_included.txt
    ' input.txt
    
    wc -l < not_included.txt
    

    输出

    dea 112233 123 zy45
    xyz%$@! xx@@yyz%$@! kk
    abc hhttzzw
    4
    

    【讨论】:

      【解决方案3】:
      sed -r '/^[ ]*[^ ]+[ ][^ ]+([ ]|$)/!d' ex >| tmp
      sed -r '/^[ ]*[^ ]+[ ][^ ]+([ ]|$)/d' ex >| delete
      sed -r '/^[ ]*[^ ]+[ ][^ ]{3,}/d' tmp >> delete
      sed -r '/^[ ]*[^ ]+[ ][^ ]{3,}/!d' tmp >| yolo
      sed -r 's/(^[ ]*[^ ]+[ ])([^ ])([^ ])([^ ])(.*)/\1\2\2\3\3\4\4\5/' yolo
      sed -n '$=' delete
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-03-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-27
        • 1970-01-01
        • 2022-01-16
        相关资源
        最近更新 更多