使用awk根据条件打印文本

时间:2019-11-03 13:28:48

标签: awk

我要打印:

从\ a到\ b

从\ c到\ d

的形式

当行中带有\ item的星号从\ c打印到\ d

    awk '
/\\a|\\c/{
  found=1
}
found;
/\\b|\\d/{
  found=""
}
/\\item/ && match($0,/\\c.*\\d/){
print substr($0,RSTART,RLENGTH)
}' file.txt

file.txt

text
\c
fr
6
\d
text
\item text \c apple \d
text

所需的输出:

\c
fr
6
\d
\c apple \d

现在的输出:

\c
fr
6
\d
\item text \c apple \d
\c apple \d

所以问题在于,也打印了以\ item开始的行。请问如何解决?

1 个答案:

答案 0 :(得分:0)

\c\a开始打印。

如果\d\b打印当前行,请停止打印并next

如果行以\item开头并具有\c\d的序列,请提取该序列,然后打印并next

有很多我不知道会发生什么奇怪的输入,例如ex。在\item\c之间找到带有\d的行时。或者在\b之后找到行\c。我忽略了这种情况。

以下测试:

awk '
    /^\\item.*\\c.*\\d/{
        sub(/.*\\c/, "\\c", $0)
        sub(/\\d.*/, "\\d", $0)
        print
        next
    }
    /\\c|\\a/,/\\b|\\d/
' <<EOF
text
c
a
\c
fr
6
\d
text
\item text \c apple \d
text
EOF

输出:

\c
fr
6
\d
\c apple \d

但是sed解决方案对我来说更好:

sed -n '
    /^\\item.*\(\\c.*\\d\).*$/{ s//\1/; p; d; }
    /\\c/,/\\d/p
    /\\a/,/\\b/p
'