【发布时间】:2010-08-23 15:08:42
【问题描述】:
如何打印之间的所有行 “B节(” 到下一个以行开头的“节”字?
A 部分(
。 .
)
B 部分(
。 .
)
C 部分(
。 .
)
【问题讨论】:
标签: sed
如何打印之间的所有行 “B节(” 到下一个以行开头的“节”字?
A 部分(
。 .
)
B 部分(
。 .
)
C 部分(
。 .
)
【问题讨论】:
标签: sed
sed -n '
/^section B/!n;
/^section B/d;
/^)/q;
p
' yourfile
上述sed脚本的解释,分步骤:
! 不以section B 开头的行移动到下一行。section B 文本行。) 开头,我们将退出。【讨论】:
/^section B/!n; 让我打印该行之前的内容。
如果您想打印从“B 部分”到“C 部分”的所有内容包括这些行,
sed -ne '/^section B/,/^section/p'
如果您不想打印两个“节”行,
sed -e '1,/^section B/d' -e '/^section/,$d'
如果您想包含“section B”和右括号(但不是“section C”),
sed -ne '/^section B/,/^)/p'
还有一些其他可能的变体。
【讨论】:
sed -n '/section B/,/)/p' file
或 awk
awk '/section B/,/)/{print}' file
awk -vRS=")" '/section B/{print $0RT}' file
【讨论】:
一般来说,如果您想在文件中的行之间“保持状态” - 就像您在此处所做的那样 - 那么 sed 将无法完成这项工作。在这种情况下,Awk 可能是您可以使用的最简单的工具。
以下 awk 脚本可以满足您的需求:
/^section\ B\ \(/ {InSection=1; next;}
/^\)/ {InSection=0; next;}
// {if (InSection) print $0;}
【讨论】: