我要打印:
从\ 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开始的行。请问如何解决?
答案 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
'