Linux

Linux sed 正則表達式轉義

  • October 23, 2019

我使用 sed -i 替換 xml 文件中的埠值,

<property name="port" value="8954" />

但我不知道如何逃避正則表達式,我的正則表達式在下面。

(?<=name="port"\s+value=")\d+(?=")

我的命令是

sed -i "s/${PORTREX}/$NEWPORT/g" config.xml

我在評論中寫了這個,因為我沒有意識到這已經是解決方案。OP 寫道它有效,所以這次作為答案:

sed "s/\(name=\"port\" *value=\"\)[0-9]*/\1$NEWPORT/g" config.xml

OP 建議的正則表達式使用了幾個非標準擴展,因此它不適用於sed,但您不需要它們:

我使用 sed -i 替換 xml 文件中的埠值,

但我不知道如何逃避正則表達式,我的正則表達式在下面。

  • 而不是“lookbehind” (?<=somestring),您可以按原樣使用字元串,但它會將\(somestring\)其標記為子表達式並在替換中重用它 as \1,因此不要說“這需要存在,但不能被替換”,只需替換它與自己
  • +\{1,\}(一次或多次出現)的快捷方式,但您也可以替換a+aa*. 在這種情況下,使用 simple 可能更省事*,因為零出現是不可能的
  • 在我看來,這\d並不比閱讀更好[0-9]
  • \s可以替換為[[:space:]][ <literal tab>]。這裡有一個簡單的空格就可以了

**結論:幾乎所有 reg-ex 擴展都可以輕鬆避免,可能會給出一些冗長的模式或難以閱讀,但通常沒有缺點。**一個例外是非貪婪匹配:在某些情況下,您需要一個沒有它們的不同概念。

引用自:https://unix.stackexchange.com/questions/545660