入力ファイルにはいくつかのセクションがあり、開始タグと終了タグで区切られています。次に例を示します。
line A
line B
@@inline-code-start
line X
line Y
line Z
@@inline-code-end
line C
line D
このファイルに変換を適用して、行X、Y、Zを何らかのコマンド(nl
など)でフィルター処理し、残りの行は変更せずに通過させます。nl
(number行)は行をまたいで状態を蓄積するため、行X、Y、Zのそれぞれに適用されるのは静的な変換ではないことに注意してください。(編集:それがあることが指摘されたnl
モードでの缶の仕事が蓄積状態を必要としないが、私はちょうど使用していますnl
質問を簡素化するための例として、実際にはコマンドは、より複雑なカスタムスクリプトです。。私が本当に探していますどのようなforは、入力ファイルのサブセクションに標準フィルターを適用する問題の一般的な解決策です)
出力は次のようになります。
line A
line B
1 line X
2 line Y
3 line Z
line C
line D
ファイルには、変換を必要とするこのようなセクションがいくつか存在する場合があります。
更新2私はもともと、たとえば次のようなセクションが複数ある場合に何が起こるかを指定しませんでした。
line A
line B
@@inline-code-start
line X
line Y
line Z
@@inline-code-end
line C
line D
@@inline-code-start
line L
line M
line N
@@inline-code-end
私の期待は、特定のセクション内でのみ状態を維持する必要があることです。
line A
line B
1 line X
2 line Y
3 line Z
line C
line D
1 line L
2 line M
3 line N
しかし、セクション間で状態を保持する必要があると問題を解釈することは有効であり、多くのコンテキストで役立つと思います。
アップデート2を終了
私が最初に考えたのは、現在のセクションを追跡する単純なステートマシンを構築することです。
#!/usr/bin/bash
while read line
do
if [[ $line == @@inline-code-start* ]]
then
active=true
elif [[ $line == @@inline-code-end* ]]
then
active=false
elif [[ $active = true ]]
then
# pipe
echo $line | nl
else
# output
echo $line
fi
done
私が実行するもの:
cat test-inline-codify | ./inline-codify
への各呼び出しnl
は独立しているため、これは機能しません。したがって、行番号は増加しません。
line A
line B
1 line X
1 line Y
1 line Z
line C
line D
私の次の試みは、FIFOを使用することでした:
#!/usr/bin/bash
mkfifo myfifo
nl < myfifo &
while read line
do
if [[ $line == @@inline-code-start* ]]
then
active=true
elif [[ $line == @@inline-code-end* ]]
then
active=false
elif [[ $active = true ]]
then
# pipe
echo $line > myfifo
else
# output
echo $line
fi
done
rm myfifo
これにより正しい出力が得られますが、順序は間違っています。
line A
line B
line C
line D
1 line 1
2 line 2
3 line 3
おそらくいくつかのキャッシングが進行中です。
私はこれについてすべて間違っていますか?これはかなり一般的な問題のようです。これを解決するシンプルなパイプラインが必要だと思います。
nl
フィルターの例としてのみ使用していることを明確にしました。フィルターが正確に何をしていたのかを詳細に説明することで質問を簡素化できると思いましたが、おそらくもっと混乱を招きました。実際、私は、独自の静的ブログジェネレーターのために、コードハイライターを通してサブセクションをフィルター処理しています。現在、私はgnuを使用してsource-highlight
いますが、それは変更される可能性があり、フォーマッターなどのフィルターを追加する可能性があります。
nl
状態を蓄積する必要はありません。セクション区切り文字の情報についてはnl -d
、man
/info
ページを見て確認してください。nl