特定の行の一部を印刷する

特定の行の一部を印刷する

ファイルを読み、次を含むすべての行を印刷したいと思います。

## 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:]]水平スペースと一致します。たとえば、デフォルトの正規表現BREの代わりに拡張正規表現EREsedオプションを使用して数量子を使用できます。-E+

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

パターンの2つのバリエーションを文字通り解釈すると、次のsed2つのガイドラインを含むスクリプトが生成されます。

s/^## \(DF \)/\1/p
s/..* # \(DF \)/\1/p

最初は## DF <anything>行の先頭で置き換えられDF <anything>、これは<anything>任意の長さの空の文字列と見なされます。

2番目の命令はwhere<something> # DF <anything>で置き換えられ、これはすべての長さの空でない文字列と見なされます。デフォルトの正規表現は、1つ以上の文字に一致するパターンである拡張正規表現と同じです。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 Input

答え4

使用幸せ(以前のPerl_6)

~$ raku -ne 'put $/  if m/ ^ "## " <( DF .* )> $ || .+ "# " <( DF .* )> $ /;'  file
    
#OR
    
~$ raku -ne 'put $<> if m/ ^ "## " <( DF .* )> $ || .+ "# " <( DF .* )> $ /;'  file

上記は、Perlシリーズのプログラミング言語であるRakuで書かれた答えです。 Rakuは、特にUnicodeの高度なサポートと組み込みの有利な機能を提供します。

つまり、m/ /最初に文字列の先頭で一致を探し、次に"## "<( DF .* )>DF」、1つ以上の文字が続くか、||2番目に1つ以上の文字、次にインテリア、"# "またはが続きます<( 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

関連情報