出力の各行からすべての先頭と末尾のスペースとタブを削除したいと思います。
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
その後、すべてのフィールド(、...、)を(デフォルトでは空白)にリンクして、再構成する必要があるレコード全体(、デフォルトで印刷される内容)にアクセスしようとします。print
awk
$1
$NF
OFS
空の行も削除するには、次のように変更しますawk 'NF{$1=$1;print}'
(NF
条件としてフィールドN
数がゼロ以外のレコードを選択しますF
)。するいいえ時々推奨されるように、これは最初のフィールドが(、、、...)awk '$1=$1'
0
でサポートされている表現である行も削除します。awk
0
00
-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:]]}"