Linux

在 sed 中使用子集替換為正則表達式

  • August 26, 2019

考慮一些看起來像這樣的數據:

"2019-12-12 00:00:01","2012-01-01 01:01:01"

我希望將其替換為有效的日期時間 json 值:

"2019-12-12T00:00:01+01","2012-01-01T01:01:01+01"

我嘗試編寫以下 sed 命令:

sed 's/"([0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]) ([0-9][0-9]:[0-9][0-9]:[0-9][0-9])"/\1T/g' test.csv > testnew.csv

但是,這會出現以下錯誤:

sed: -e expression #1, char 99: invalid reference \1 on `s' command's RHS

為什麼會發生這種情況,我如何引用正則表達式搜尋的子匹配項?

正如@steeldriver 提到的,您需要像這樣逃避您的 () :

sed 's/"\([0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]\) \([0-9][0-9]:[0-9][0-9]:[0-9][0-9]\)"/"\1T\2+01"/g' test.csv > testnew.csv

或者根據您的 sed 版本使用帶有 -E 或 -r 的擴展正則表達式。這也使我們能夠在不製作柵欄的情況下稍微清理組:

sed -E 's/"([0-9]{4}-[0-9]{2}-[0-9]{2}) ([0-9]{2}:[0-9]{2}:[0-9]{2})"/"\1T\2+01"/g' test.csv > testnew.csv

我已將 ‘\2+01’ 添加到這兩個的替換中,因為這似乎是產生所需輸出所需要的。如果我誤解了你可能想改變它

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