web-dev-qa-db-ja.com

一部の出力の各行から先頭と末尾の空白を削除するにはどうすればよいですか?

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

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 
189
rubo77

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ツールのほとんどは、これらのクラスをサポートしています。

 [[:alnum:]]  - [A-Za-z0-9]     Alphanumeric characters
 [[:alpha:]]  - [A-Za-z]        Alphabetic characters
 [[:blank:]]  - [ \x09]         Space or tab characters only
 [[:cntrl:]]  - [\x00-\x19\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]       All whitespace chars
 [[:upper:]]  - [A-Z]           Upper-case alphabetic characters
 [[:xdigit:]] - [0-9a-fA-F]     Hexadecimal digit characters

リテラルセットの代わりにこれらを使用することは常にスペースの無駄のように見えますが、コードの移植性や、代替文字セット(国際的なものと考える)を扱う必要がある場合は、クラス名を使用することになるでしょう。代わりに。

参考文献

57
slm

引数なしのxargsはそれを行います。

例:

trimmed_string=$(echo "no_trimmed_string" | xargs) 
27
Newton_Jose

StéphaneChazelasが承認した回答で示唆しているように、これで
スクリプトを作成する/usr/local/bin/trim

#!/bin/bash
awk '{$1=$1};1'

そのファイルに実行権限を与えます:

chmod +x /usr/local/bin/trim

これで、すべての出力をtrimに渡すことができます。次に例を示します。

cat file | trim

(以下のコメントの場合:以前これを使用しました:while read i; do echo "$i"; done
これも正常に機能しますが、パフォーマンスは低下します)

25
rubo77
sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//'

行をシェル変数に読み込んでいる場合、readは既にそれを実行しています 特に指示されていない限り

行を変数として保存する場合、bashを使用してジョブを実行できます。

文字列から先頭の空白を削除します。

shopt -s extglob
echo ${text##+([[:space:]])}

文字列から末尾の空白を削除します。

shopt -s extglob
echo ${text%%+([[:space:]])}

文字列からすべての空白を削除します。

echo ${text//[[:space:]]}
17
Łukasz Rajchel

「パイプ」ツールのおかげで、指定された行のすべての先行スペースと後続スペースを削除するために、完全に同等ではない3つの異なる方法を特定できます。これらの違いは、入力行の単語間のスペースに関係します。予想される動作に応じて、選択を行います。

違いを説明するために、このダミーの入力行を考えてみましょう:

"   \t  A   \tB\tC   \t  "

tr

$ echo -e "   \t  A   \tB\tC   \t  " | tr -d "[:blank:]"
ABC

trは本当に単純なコマンドです。この場合、スペースや集計文字は削除されます。

awk

$ echo -e "   \t  A   \tB\tC   \t  " | awk '{$1=$1};1'
A B C

awkは、先頭と末尾のスペースを削除し、単語間のスペースごとに1つのスペースに絞り込みます。

sed

$ echo -e "   \t  A   \tB\tC   \t  " | sed 's/^[ \t]*//;s/[ \t]*$//'
A       B   C

この場合、sedは、単語間のスペースに触れずに先頭と末尾のスペースを削除します。

備考:

1行に1ワードの場合、trが機能します。

15
frozar

あなたが一目で理解できる答え:

_#!/usr/bin/env python3
import sys
for line in sys.stdin: print(line.strip()) 
_

おまけ: str.strip([chars]) を任意の文字に置き換えて、必要に応じて.lstrip()または.rstrip()をトリムまたは使用します。

rubo77の回答 のように、スクリプト_/usr/local/bin/trim_として保存し、_chmod +x_でアクセス許可を付与します。

4
qwr

変換コマンドが機能する

cat file | tr -d [:blank:]
2
Srinagesh

このシェル関数はawkを使用して作成しました

_awkcliptor(){
    awk -e 'BEGIN{ RS="^$" } {gsub(/^[\n\t ]*|[\n\t ]*$/,"");print ;exit}' "$1" ; } 
_

_BEGIN{ RS="^$" }_:
セットレコードの解析を開始する前の最初
区切り記号なし。つまり、入力全体を
単一のレコード

gsub(this,that)
この正規表現をその文字列に置き換えます

_/^[\n\t ]*|[\n\t ]*$/_:
その文字列の前の改行スペースとタブクラスをキャッチします
または改行スペースとタブクラスを投稿して、それらを
空の文字列

_print;exit_:次に出力して終了します

_"$1"_:
関数の最初の引数を
awkによるプロセス

使い方:
上記のコードをコピーし、シェルに貼り付けて、次のように入力します
関数を定義します。
その後、最初の引数を入力ファイルとして、awkcliptorをコマンドとして使用できます

使用例:

_echo '
 ggggg    

      ' > a_file
awkcliptor a_file
_

出力:

_ggggg
_

または

_echo -e "\n ggggg    \n\n      "|awkcliptor 
_

出力:

_ggggg
_

トリムしようとしている文字列が短く、連続的/連続的である場合、単純にそれをパラメーターとして任意のbash関数に渡すことができます。

    trim(){
        echo $@
    }

    a="     some random string   "

    echo ">>`trim $a`<<"
Output
>>some random string<<
1
Subrata Das
_trimpy () {
    python3 -c 'import sys
for line in sys.stdin: print(line.strip())'
}
trimsed () {
gsed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//'
}
# example usage
echo " hi " | trimpy
_

おまけ:str.strip([chars])を任意の文字に置き換えて、必要に応じて.lstrip()または.rstrip()をトリムまたは使用します。

(これは、他の回答のリミックスです)。

0
HappyFace