awk - 使用 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 的行也被打印了。请问这个怎么解决?
解决方案
\c
在或开始打印\a
。
如果\d
或\b
打印当前行,则停止打印并next
.
如果 line 以 to 开头\item
并具有\c
to\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
'
推荐阅读
- rabbitmq - 无法启动 RabbitMQ:未定义函数 rabbitmqctl_escript:main/1
- java - Kafka可以用作分布式工作队列吗
- vb.net - 在 My.Settings 中将特定值重置为默认值
- java - 将对象列表转换为 json 数组以休息模板
- python - 从维基百科页面解析 OpenURL 数据
- android - 在另一个类中使用另一个类的数组时出现越界异常
- reactjs - 所有 SVG 大小相同
- html - 如何将背景上的渐变效果标记为重要?
- css - CSS如何在输入框的末尾有一个图像
- javascript - 在 Safari 中从 https://example.com 向 http://127.0.0.1:8766/test/ 发送请求