2016-07-30 9 views
2

私はパイプの刺しを使って作成したテキストをいくつか持っており、awkの代わりにechoを使ってさらに操作したいと思います。物事をエコーまたはプリントにパイプするときのSTDINのパラメータ呼び出しとは何ですか?

私が持っていると言う:すべてのテキストをカットする

a chain | of | commands | producing |stream | of text | echo ${STDIN%text} 

:私はこのような何かをするために、エコーを使用したい場合

line 1 text 
line 2 text 
line 3 text 

しかし:

a chain | of | commands | producing |stream | of text 

利回りそれがラインを言うところの後に、私はこの期待される結果を得るためにそれをどのように参照するでしょう:

line 1 
line 2 
line 3 
+4

「echo」は、ここでは適切なツールではありません。 '' echo''を含む解決策は複雑で不自然になります。 sedまたはawkが最適です。 –

答えて

3

awkのようなツールは、あなたのシナリオに最適です:レコード全体$0上のデフォルトの行為によって

a chain | of | commands | awk '{sub(/[[:blank:]]*text$/,"")}1' 

subと、検索テキスト内のスペース/タブの数を保持します。


もっとawkを必要としますか? [ this ]を確認してください。それはparameter expansionsから${var%text}としてSTDIN入力を適用することが便利であろうが

+0

@JohnKugelman:Thankyou、updated – sjsam

+1

また、パイプラインの出力が多すぎると、パイプラインの出力をbash配列に格納するものはすべてクラッシュします。 –

+0

@StephenC:私はなぜawkソリューションを提供するのか理解しています。:) – sjsam

4

、シェルはそれをサポートしていません - 名前が示すように、パラメータ展開はパラメータ(変数)に限定されています。

あなたはでしパイプwhile IFS= read -r line ...ループへのご命令と${line}にループ本体の拡大を行い、このようなアプローチは次のようになりますが遅い(および冗長)。上記sedコマンドはパラメータ展開はどうなるんまさに

cat <<<$'line 1 text\nline 2 text\nline 3 text' | sed 's/text$//' 

したがって、外部ユーティリティは、sedとしてここに最良の選択は、あります。
「テキスト」の前にスペースをトリミングする場合は、sed 's/ text$//'sed 's/ \{1,\}text$//'

  • で終わる任意の行に一致text$(基本)正規表現:変数スペースの数が、少なくとも1をトリミングするsed 's/ *text$//'
    :何も含まないスペースの可変数をトリミングする
    $text

  • s/...//は、一致する部分を何もない(空の文字列)に置き換え、textサフィックスを効果的に削除します。


sjsam's helpful answerawkベースの代替案を示します。

+0

私が思うawkの答えが最も理にかなっています。ありがとうございました – Tom

+0

@Tom: 'sed'ソリューションも同様にうまくいくでしょうし(やや簡潔です)、パフォーマンスも似ていますので、どちらの解決策も問題ありません。一般に、 'sed'の強い訴訟は正規表現ベースの変換(この場合)ですが、awkはフィールドベースの処理に優れています。 – mklement0

関連する問題