打印某些行的部分

打印某些行的部分

我想读取一个文件并打印包含的所有行

## 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

https://docs.raku.org
https://raku.org

相关内容