文字列から先行スペースを削除します。

文字列から先行スペースを削除します。

出力の各行からすべての先頭と末尾のスペースとタブを削除したいと思います。

trim出力をパイプで接続するための簡単なツールはありますか?

サンプルファイル:

test space at back 
 test space at front
TAB at end  
    TAB at front
sequence of some    space in the middle
some empty lines with differing TABS and spaces:





 test space at both ends 

答え1

awk '{$1=$1;print}'

またはより短く:

awk '{$1=$1};1'

先行および末尾のスペースまたはタブを切り取ります。 1 そして一連のタブとスペースを1つのスペースに圧縮します。

これは誰かに何かを割り当てるときに機能します。 大地$0その後、すべてのフィールド(、...、)を(デフォルトでは空白)にリンクして、再構成する必要があるレコード全体(、デフォルトで印刷される内容)にアクセスしようとします。printawk$1$NFOFS

空の行も削除するには、次のように変更しますawk 'NF{$1=$1;print}'NF条件としてフィールドN数がゼロ以外のレコードを選択しますF)。するいいえ時々推奨されるように、awk '$1=$1'これは最初のフィールドが(、、、...)0でサポートされている表現である行も削除します。awk000-0e+12


¹およびその他の空白文字(ロケールおよびawk実装によって異なります)

答え2

GNUを使用している場合、コマンドは次のように圧縮できますsed

$ sed 's/^[ \t]*//;s/[ \t]*$//' < file

はい

これが上記のコマンドが実際に実行する操作です。

$ echo -e " \t   blahblah  \t  " | sed 's/^[ \t]*//;s/[ \t]*$//'
blahblah

これを使用して、コマンドが必要な文字を正しく削除することをhexdump確認できます。sed

$ echo -e " \t   blahblah  \t  " | sed 's/^[ \t]*//;s/[ \t]*$//' | hexdump -C
00000000  62 6c 61 68 62 6c 61 68  0a                       |blahblah.|
00000009

キャラクタークラス

次のようにコレクションをそのままリストするのではなく、文字クラス名を使用することもできます[ \t]

$ sed 's/^[[:blank:]]*//;s/[[:blank:]]*$//' < file

はい

$ echo -e " \t   blahblah  \t  " | sed 's/^[[:blank:]]*//;s/[[:blank:]]*$//'

正規表現(regex)を使用するほとんどのGNUツールはこれらのクラスをサポートしています(ASCIIベースのシステムの一般的なCロケールではここ(そしてそこにのみ))。

 [[:alnum:]]  - [A-Za-z0-9]     Alphanumeric characters
 [[:alpha:]]  - [A-Za-z]        Alphabetic characters
 [[:blank:]]  - [ \t]           Space or tab characters only
 [[:cntrl:]]  - [\x00-\x1F\x7F] Control characters
 [[:digit:]]  - [0-9]           Numeric characters
 [[:graph:]]  - [!-~]           Printable and visible characters
 [[:lower:]]  - [a-z]           Lower-case alphabetic characters
 [[:print:]]  - [ -~]           Printable (non-Control) characters
 [[:punct:]]  - [!-/:-@[-`{-~]  Punctuation characters
 [[:space:]]  - [ \t\v\f\n\r]   All whitespace chars
 [[:upper:]]  - [A-Z]           Upper-case alphabetic characters
 [[:xdigit:]] - [0-9a-fA-F]     Hexadecimal digit characters

リテラルセットの代わりにそれを使用することは常にスペースの無駄のように見えますが、コードの移植性が気になる場合や代替文字セット(国際化された文字セットを考えてみてください)を処理する必要がある場合は、代わりにクラス名を使用できます。

引用する

答え3

パラメーターを持たない xargs はこれを行うことができます。

例:

trimmed_string=$(echo "no_trimmed_string" | xargs) 

答え4

行を変数として保存すると、bashを使用して操作を実行できます。

文字列から先行スペースを削除します。

shopt -s extglob
printf '%s\n' "${text##+([[:space:]])}"

文字列から末尾のスペースを削除します。

shopt -s extglob
printf '%s\n' "${text%%+([[:space:]])}"

文字列からすべてのスペースを削除します。

printf '%s\n' "${text//[[:space:]]}"

関連情報