ファイルを読み、次を含むすべての行を印刷したいと思います。
## 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つのバリエーションを文字通り解釈すると、次のsed
2つのガイドラインを含むスクリプトが生成されます。
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