テキストストリームまたはファイルから一般的な初期スペースを見つけて削除する方法を探しています。削除したくないみんな先行スペース(簡単なスペースです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]
H
d
$!
g
\n
s/\n[^\n]/\n/g
/\n[^\n[:blank:]]/!
m
s/.//
答え2
出力の最初の行にのみ興味がある場合は、1行だけを指定してsedが表示する内容を制限します。
printf ' some text\n\n some more text\n' |sed '1s/^[ \t]*\([^ \t]\+.*\)$/\1/'
これは先行スペースを無視し、空白ではなく行と行の残りの部分と一致し、行 1 でのみ一致します。