2017-04-06 13 views
1

BASHを使用して変数の値から先頭と末尾の空白(SPC)を削除しようとすると、記述されているとおりに動作しないと思います。BASHではパターン置換のために特別なスペースがありますか?

% val=" a ";echo "|${val}|${val## }|" 
| a | a | 
% val=" a ";echo "|${val}|${val%% }|" 
| a | a | 

その後、私は何を削除していないようだどのパターンマッチングを試してみました(彼らはまた、繰り返しに空白を削除する必要があります。私は、最長のパターンを削除するべき${var%% }${var## }で始めたが、それだけで1つのブランクが削除されたようです 値の開始または終了):

% val=" a ";echo "|${val}|${val//# }|" 
| a | a | 
% val=" a ";echo "|${val}|${val//% }|" 
| a | a | 

私はいくつかの簡単な間違いを感じますが、私は目の前に座っているようです:なぜこれは機能しませんか?

(私はすでにこれらの答えを訪問しましたが、彼らは "私の解決策" が含まれていない:How to remove space from string? How to trim whitespace from a Bash variable?、 )

+0

1つのスペースに一致しています。一致した文字列は、変数の先頭または末尾から開始または終了する必要があります。 '$ {val ##} ''や '$ {val ## *}''を試してみてください。あなたの例でわかるように、単一のスペースを削除しています。 – 123

+0

@ 123:実際に私もそれを試みました。しかし、それはすべてを削除します! 'val =" a "; echo" | $ {val} | $ {val ## *} | "' outputs '| a || '(そして単一の'# 'は' | a | a | 'を生成します)。 ( 'val =" a "; echo" | $ {val} | $ {val ##} | "'もうまくいきません: '| a | a |') 私は尋ねる前にすべて試しました。質問のタイトル;-) –

+0

ええ、最善の策は以下の答えのようにextglobを使うことです。 – 123

答えて

2

スペース(0x20の)globパターンとREのパターンの両方のための特別なものではありません。あなたの問題のために

私はextglobシェルオプションを利用します:

[STEP 108] # shopt -s extglob 
[STEP 109] # v=' foo ' 
[STEP 110] # echo "|${v##+()}|" 
|foo | 
[STEP 111] # echo "|${v%%+()}|" 
| foo| 
[STEP 112] # echo "|${v%%+([[:blank:]])}|" 
| foo| 
[STEP 113] # echo "|${v##+([[:blank:]])}|" 
|foo | 
[STEP 114] # 
+0

ニース!私は 'extglob'構文を使用しようとしました。正規表現アンカー '^'と '$'を誤って動作しなかったパラメータ拡張で試してみました。これはいい! – Inian

+0

これは便利かもしれません:http://stackoverflow.com/questions/12179633/make-shopt-change-local-to-function –

-1

あなたはsedでこれをアーカイブすることができます。

文字列の最後にすべての主要な空きスペースや空のスペースを削除するには...

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

問題はそのスペース(SPC)が特別に処理されません。代わりに、問題は、()は、デフォルトで設定されているように思われた(extglobが設定されていない限り)はbashのマニュアルページで使用されるようパターンパス名パターンを参照し、ないに正規表現ということです。つまり、' *'ブランクのシーケンスではありませんが、ブランクの後にはいずれもと続きます。

第2の問題は、 "最も長いマッチングパターン"は、失敗するまで繰り返しマッチングを適用することによって決定されるのではなく、1回だけです。したがって、パターンに*が含まれていない場合、%%%は同じ結果を返します。###のようになります。 ${val//# }

問題は、次のとおり

  • ///#を組み合わせることができません。 1つの変種しか使用できません。 ${parameter/pattern/string}

  • パターンは正規表現ではなく、パス名のパターン(まだ)

これは ${val# }を使用して上${val/# }を使用することの何のメリットがないことを意味します。すべての先頭と末尾の空白を削除するには、以下の(やや複雑な)コードを使用することができます。

val=" a " 
echo -n "|${val}" 
while [ "_$val" != "_${val# }" ] 
do 
    val="${val# }" 
done 
while [ "_$val" != "_${val% }" ] 
do 
    val="${val% }" 
done 
echo "|${val}|" 

extglobを使用しているとき(前の回答で指摘したように)ので、解決策は次のようになります。

al=" c " 
echo -n "|${val}" 
val="${val##+()}" 
val="${val%%+()}" 
echo "|${val}|" 
関連する問題