5

こんにちは、x86 マシンで次のコマンドを使用すると (/bin/sh を使用)、次のように返されます。<port>3<port>

test="port 3"
echo $test | sed -r 's/\s*port\s*([0-9]+)\s*/<port>\1<\/port>/'

ただし、ARM ベースのネットワーク スイッチの sh シェルで同じコマンドを実行すると、string が返されますport 3

x86 マシンで取得したのと同じ結果をスイッチで取得するにはどうすればよいですか? 私には、数字が[0-9]でキャプチャされていないようです。

4

2 に答える 2

4

\s標準の sed 動作に対する GNU sed 拡張です。GNU sed は、デスクトップ/サーバー Linux システムでの実装です。ほとんどの組み込み Linux システムは、 BusyBoxを実行します。これは、フットプリントが著しく小さく、機能が少ないユーティリティ スイートです。

「任意の空白文字」を指定する標準的な方法は、[:space:] 文字クラスです。これは BusyBox でサポートされています (少なくとも、ほとんどの BusyBox インストールでサポートされています。ほとんどの BusyBox 機能は、フットプリントをさらに小さくするために取り除くことができます)。

BusyBox もこのオプションをサポートしていません。基本的な正規表現-rを使用する必要があります。BRE では、グループをマークします。演算子はなく、 のみです。\(…\)+*

echo "$test" | sed 's/[[:space:]]*port[[:space:]]*\([0-9][0-9]*\)[[:space:]]*/<port>\1<\/port>/'

を引用符で囲んでいないため$test、シェルは変数の値に対して単語分割とワイルドカード展開を実行したことに注意してください。つまり、変数の値は、空白で区切られたファイル名のリストとして扱われ、その後 1 つのスペースで結合されていました。したがって、引用符を省略しても、さまざまな種類の空白を気にする必要はありませんecho $test | sed 's/ *port *([0-9][0-9]*) */<port>\1<\/port>/'。ただし、 だっ$testた場合port *、結果は現在のディレクトリに存在するファイルによって異なります。

于 2012-05-02T21:30:11.697 に答える
3

すべての sed が reg-expression short-hand like をサポートしているわけではありません\s。よりポータブルなバージョンは

  test="port 3"
  echo "$test" | sed -r 's/[ ]*port[ ]*([0-9]+)[ ]*/<port>\1<\/port>/'

タブ文字も確認する必要がある場合は、それらを char クラス (3 か所すべて) に追加するだけです。この例では、スペース文字、つまり[ ]ビットのみが含まれています。

出力

<port>3</port>

これが役立つことを願っています。

于 2012-05-02T16:52:50.783 に答える