我想要读取一个文件并打印所有包含
## 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发布于 2023-03-24 04:04:53
使用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:]]匹配任何水平空格。例如(对扩展正则表达式使用sed's -E选项ERE,而不是默认的基本正则表达式BRE,以便我们可以使用+量词):
sed -n -E 's/.*#[[:blank:]]+DF[[:blank:]]+/DF /p' /tmp/df.txt 发布于 2023-03-24 03:09:27
使用GNU grep:
$ grep -oP '# \KDF .*' file
DF [LBPOS] Label Position
DF [KTG] Category
DF [KARG] Control Argument
DF [LNP] Line Input发布于 2023-03-24 15:06:29
从字面上解释这两个模式变体,您将得到一个由以下两个指令组成的sed脚本:
s/^## \(DF \)/\1/p
s/..* # \(DF \)/\1/p第一种方法在行的开头用## DF <anything>替换DF <anything>,其中假定<anything>可能是任意长度的空字符串。
第二个指令将<something> # DF <anything>替换为DF <anything>,其中假定<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 Inputhttps://unix.stackexchange.com/questions/740772
复制相似问题