sed只打印至少包含2个单词的行

时间:2018-01-22 18:43:35

标签: bash shell unix sed

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

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

- 只有该行至少有两个单词

- 只有第二个Word至少有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

任何帮助都会很棒:)

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

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

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

T标签 -                 如果没有s ///已经成功替换,因为读取了最后一个输入行,从那以后                 最后一个t或T命令,然后分支到标签;如果省略label,则跳转到脚本结尾。                 这是一个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

答案 2 :(得分:0)

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