我想读取一个文件并打印包含的所有行
## DF <anything>
或者以以下结尾
<something> # DF <anything>
DF
然后从开始打印
这里有些例子
local lbpos=21 # DF [LBPOS] Label Position
local ktg="PILE" # DF [KTG] Category
## DF [KARG] Control Argument
Some text
printf '%s\n' "$@" \
| while IFS="" read -r lnp; do # DF [LNP] Line Input
More text
结果
DF [LBPOS] Label Position
DF [KTG] Category
DF [KARG] Control Argument
DF [LNP] Line Input
答案1
使用 sed:
$ sed -n -e 's/.*# DF */DF /p' /tmp/df.txt
DF [LBPOS] Label Position
DF [KTG] Category
DF [KARG] Control Argument
DF [LNP] Line Input
如果输入文件中的空格可能是制表符而不是(或同时)空格,请使用[[:blank:]]
而不是仅使用空格。 [[:blank:]]
匹配任何水平空白。例如(使用扩展正则表达式 EREsed
的-E
选项,而不是默认的基本正则表达式 BRE,以便我们可以使用量词+
):
sed -n -E 's/.*#[[:blank:]]+DF[[:blank:]]+/DF /p' /tmp/df.txt
答案2
与GNU
grep
:
$ grep -oP '# \KDF .*' file
DF [LBPOS] Label Position
DF [KTG] Category
DF [KARG] Control Argument
DF [LNP] Line Input
答案3
从字面上解释模式的两种变体,您最终会得到一个sed
包含以下两条指令的脚本:
s/^## \(DF \)/\1/p
s/..* # \(DF \)/\1/p
其中第一个## DF <anything>
在行的开头替换为DF <anything>
,其中<anything>
假定可能是任意长度的空字符串。
第二条指令替换<something> # DF <anything>
为DF <anything>
where ,<something>
假定为任意长度的非空字符串。基本正则表达式..*
与 相同.\{1,\}
,与扩展正则表达式相同.{1,}
,与 相同.+
,即匹配一个或多个字符的模式。
测试(测试数据取自问题,但删除了每行的前几个空格字符):
$ sed -n -e 's/^## \(DF \)/\1/p' -e 's/..* # \(DF \)/\1/p' file
DF [LBPOS] Label Position
DF [KTG] Category
DF [KARG] Control Argument
DF [LNP] Line Input
答案4
使用乐(以前称为 Perl_6)
~$ raku -ne 'put $/ if m/ ^ "## " <( DF .* )> $ || .+ "# " <( DF .* )> $ /;' file
#OR
~$ raku -ne 'put $<> if m/ ^ "## " <( DF .* )> $ || .+ "# " <( DF .* )> $ /;' file
以上是用 Raku(Perl 编程语言家族的成员)编写的答案。 Raku 的特点(除其他外)对 Unicode 的高级支持,以及内置的有理数。
简而言之,m/ /
首先寻找字符串开头的匹配"## "
,后跟<( DF .* )>
,即“DF”,后跟一个或多个字符,或者||
其次寻找一个或多个字符,后跟内部"# "
,后跟<( DF .* )>
,即“ DF" 后跟零个或多个字符。
Raku 的<(
...)>
捕获标记会删除标记之外的所有识别元素。如果找到匹配项,则仅$/
返回(或 $<>`)匹配变量,这会删除不匹配的行。
输入示例:
local lbpos=21 # DF [LBPOS] Label Position
local ktg="PILE" # DF [KTG] Category
## DF [KARG] Control Argument
Some text
printf '%s\n' "$@" \
| while IFS="" read -r lnp; do # DF [LNP] Line Input
More text
示例输出:
DF [LBPOS] Label Position
DF [KTG] Category
DF [KARG] Control Argument
DF [LNP] Line Input