出力の各行から先頭と末尾のスペースとタブをすべて削除したいと思います。
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
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
リテラルセットの代わりにこれらを使用することは常にスペースの無駄のように見えますが、コードの移植性や、代替文字セット(国際的なものと考える)を扱う必要がある場合は、クラス名を使用することになるでしょう。代わりに。
引数なしのxargsはそれを行います。
例:
trimmed_string=$(echo "no_trimmed_string" | xargs)
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
これも正常に機能しますが、パフォーマンスは低下します)
sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//'
行をシェル変数に読み込んでいる場合、read
は既にそれを実行しています 特に指示されていない限り 。
行を変数として保存する場合、bashを使用してジョブを実行できます。
shopt -s extglob
echo ${text##+([[:space:]])}
shopt -s extglob
echo ${text%%+([[:space:]])}
echo ${text//[[:space:]]}
「パイプ」ツールのおかげで、指定された行のすべての先行スペースと後続スペースを削除するために、完全に同等ではない3つの異なる方法を特定できます。これらの違いは、入力行の単語間のスペースに関係します。予想される動作に応じて、選択を行います。
違いを説明するために、このダミーの入力行を考えてみましょう:
" \t A \tB\tC \t "
$ echo -e " \t A \tB\tC \t " | tr -d "[:blank:]"
ABC
tr
は本当に単純なコマンドです。この場合、スペースや集計文字は削除されます。
$ echo -e " \t A \tB\tC \t " | awk '{$1=$1};1'
A B C
awk
は、先頭と末尾のスペースを削除し、単語間のスペースごとに1つのスペースに絞り込みます。
$ echo -e " \t A \tB\tC \t " | sed 's/^[ \t]*//;s/[ \t]*$//'
A B C
この場合、sed
は、単語間のスペースに触れずに先頭と末尾のスペースを削除します。
備考:
1行に1ワードの場合、tr
が機能します。
あなたが一目で理解できる答え:
_#!/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
_でアクセス許可を付与します。
変換コマンドが機能する
cat file | tr -d [:blank:]
このシェル関数は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<<
_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()
をトリムまたは使用します。
(これは、他の回答のリミックスです)。