首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >某些线条的印刷部件

某些线条的印刷部件
EN

Unix & Linux用户
提问于 2023-03-24 03:00:36
回答 3查看 76关注 0票数 -2

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

代码语言:javascript
复制
## DF <anything> 

否则就会以

代码语言:javascript
复制
<something> # DF <anything>

然后从DF开始打印

以下是一些例子

代码语言:javascript
复制
  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 

结果

代码语言:javascript
复制
DF [LBPOS]  Label Position
DF [KTG]    Category
DF [KARG]   Control Argument
DF [LNP]  Line Input
EN

回答 3

Unix & Linux用户

回答已采纳

发布于 2023-03-24 04:04:53

使用sed:

代码语言:javascript
复制
$ 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,以便我们可以使用+量词):

代码语言:javascript
复制
sed -n -E 's/.*#[[:blank:]]+DF[[:blank:]]+/DF /p' /tmp/df.txt 
票数 3
EN

Unix & Linux用户

发布于 2023-03-24 03:09:27

使用GNU grep

代码语言:javascript
复制
$ grep -oP '# \KDF .*' file
DF [LBPOS]  Label Position
DF [KTG]    Category
DF [KARG]   Control Argument
DF [LNP]  Line Input
票数 2
EN

Unix & Linux用户

发布于 2023-03-24 15:06:29

从字面上解释这两个模式变体,您将得到一个由以下两个指令组成的sed脚本:

代码语言:javascript
复制
s/^## \(DF \)/\1/p
s/..* # \(DF \)/\1/p

第一种方法在行的开头用## DF <anything>替换DF <anything>,其中假定<anything>可能是任意长度的空字符串。

第二个指令将<something> # DF <anything>替换为DF <anything>,其中假定<something>是任意长度的非空字符串。基本正则表达式..*.\{1,\}相同,后者与扩展正则表达式.{1,}相同,后者与.+相同,即匹配一个或多个字符的模式。

测试(测试数据取自问题,但删除了每一行上的前几个空格字符):

代码语言:javascript
复制
$ 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
票数 0
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/740772

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档