3

多くの行を含むテキスト ファイルがあり、そのうちの 1 つが次のようになっているとします。

  <property name="HTTP_PORT" value="8080"></property>

そして、sedでこれに変更したい:

  <property name="HTTP_PORT" value="80"></property>

どうすればそれについて行くでしょうか?私はこれらを含む多くのことを試しました:

sed 's/^\(.+\)value=\"8080\"\(.+\)$/\1value=\"80\"\2/g' config.xml
sed 's/^\(.+\)value="8080"\(.+\)$/\1value="80"\2/g' config.xml
sed 's/^\(.+\)8080(.+\)$/\180\2/g' config.xml
sed 's/^\(.+\)\"8080\"\(.+\)$/\1\"80\"\2/g' config.xml
sed 's/^\(.+\)"8080"\(.+\)$/\1"80"\2/g' config.xml

しかし、すべて無駄です。入力と出力は常に同じです。

4

4 に答える 4

2

あなたが望むものの直接翻訳はどうですか:

sed 's|<property name="HTTP_PORT" value="8080"></property>|<property name="HTTP_PORT" value="80"></property>|g'

あなたや私が見つけることができるほど「賢い」解決策ではありませんが、それは彼らが来るのと同じくらい簡単で、静的な文字列を探しているので、必要なすべてです。

于 2012-04-09T22:58:11.743 に答える
1

@Kevinによる修正ごと(ありがとう!)

echo $'<property name="HTTP_PORT" value="8080"></property>'\
| sed 's/^\(.\+\)value=\"8080\"\(.\+\)$/\1value=\"80\"\2/g'

正しい修正は、「.+」プラス記号をエスケープして「1 以上」を達成することです。

元の回答を編集しました(問題の代替ソリューションを示しています) *使用しているコンテキストを考えると、従来の(ゼロ以上)の何が問題になってい.*ますか*

echo $'<property name="HTTP_PORT" value="8080"></property>'\
| sed 's/^\(.*\)value=\"8080\"\(.*\)$/\1value=\"80\"\2/g'

** 出力 **

<property name="HTTP_PORT" value="80"></property>

また、「^」と「$」で検索対象を固定するための +1。アンカーがない場合、実行時間が大幅に増加するケース(あなたがしていることと同様)を見てきました。

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

于 2012-04-09T17:47:39.390 に答える
0

これはあなたのために働くかもしれません:

sed -i '\|<property name="HTTP_PORT" value="8080"></property>|s/80//' config.xml

多分:

sed -i 's/"8080"/"80"/' config.xml
于 2012-04-09T23:41:58.253 に答える
0
$> cat text
<property name="HTTP_PORT" value="8080"></property>

$> sed --regexp-extended 's/(value=\")[0-9]*/\180/' text
<property name="HTTP_PORT" value="80"></property>
于 2012-04-09T16:22:55.643 に答える