首页 > 解决方案 > 使用 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

文件.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 的行也被打印了。请问这个怎么解决?

标签: awk

解决方案


\c在或开始打印\a

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

如果 line 以 to 开头\item并具有\cto\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
'

推荐阅读