ファイル/パイプで共通の初期スペースを検索(および削除)

ファイル/パイプで共通の初期スペースを検索(および削除)

テキストストリームまたはファイルから一般的な初期スペースを見つけて削除する方法を探しています。削除したくないみんな先行スペース(簡単なスペースですsed 's/^[[:space:]]*//')。みんなに共通する金額のみしかし空の行

例:

printf '  some text\n\n   some more text\n' | the_awesome_command_or_script

印刷する必要がある

some text

 some more text

進展:

awkシェルwhileループなどのツールを使用して最初にすべての行を繰り返し、最初のスペースを計算し、次に動的に生成されたsedコマンドを使用してスペースを削除できます。

空白を計算するawkスクリプトは次のとおりです。

awk 'BEGIN { amount = 0 }
     /^[^[:space:]]/ { print 0; exit }
     /^$/{ next }
     /^[[:space:]]/ { amount = match($0, "[^[:space:]]") - 1 }
     END { print amount }'

しかし、一時ファイルが必要です。スクリプトは次のとおりです。

generate_some_text | cat > tempfile
amount=$(above_awk_script < tempfile)
sed "s/^[[:space:]]\{$amount\}//" < tempfile
rm tempfile

質問:

作業に適したツールはありますか?一時ファイルを削除するようにスクリプトを変更できますか?

現実:

text/html要求を満たすためにmailcapエントリを改善しようとしていますcopiousoutput。今はそれですtext/html; elinks -no-home -dump %s; nametemplate=%s.html; copiousoutput;。しかし、私は推測しましたが、最初の空白のいくつかを削除したいと思います。たぶん私は仕事を複雑すぎるようですが、非常に簡単な解決策がありますか?

ベストアンサー1

すべて空白またはすべてのタブなので、次にパイプできます。

sed 'H;$!d;g;: m;/\n[^\n[:blank:]]/!s/\n[^\n]/\n/g;t m;s/.//'

それはそうです(そして他の誰もそれを支持しgnu sedないと思います)。前のバッファに各行を追加し、最後の行ではない場合は削除()するように機能します。最後の行では、予約済みスペースの内容がパターンスペースを介してコピーされます(パターンスペースの内容はewlineで始まります)。パターンスペースにスペース以外の文字()で始まる行がない場合は、各行の最初の文字()が削除されます。交換が成功するたびにラベルに分岐します。パターンスペース内の少なくとも1行が空白以外の文字で始まる場合は、パターンスペース()から先行改行文字を削除してから自動的に印刷します。sed[\n]Hd$!g\n
s/\n[^\n]/\n/g/\n[^\n[:blank:]]/!ms/.//

おすすめ記事