2017-03-13 24 views
1

如何在每個整數後跟上字母Q和整數?Bash line break在每個整數後跟特定的字符串

例如:

echo "Lorem ipsum Que Q94 dolor sit amet, Q3004 consectetur adipiscing 
elit. Q1 Idcirco enim non desideraret" | sed -e $'s/Q\([0-9]\)/\\\nQ\1/g' 

生成以下 - 不正確 - 結果:

Lorem ipsum Que 
Q4 dolor sit amet, 
Q004 consectetur adipiscing elit. 
Q Idcirco enim non desideraret 

注的第一個整數數字是如何每個Q後丟失。

預期的結果是:

Lorem ipsum Que 
Q94 dolor sit amet, 
Q3004 consectetur adipiscing elit. 
Q1 Idcirco enim non desideraret 

我缺少什麼?

回答

0

您使用的$'...'(一ANSI C-quoted Bash string)建議你使用BSD/MacOS的sed,在替換字符串中的不支持使用轉義序列\n的。

爲了避免混淆之間\ -prefixed逃避$'...'解釋前面和那些由sed解釋序列,我建議使用$'\n'選擇性,通過剪接入sed腳本恰好在需要的地方:

... | sed 's/Q[0-9]/\'$'\n''&/g' 
  • \需要在替換字符串中轉義文字換行符,

  • 這是什麼ANSI C引用字符串$'\n'產生(時間sed看到腳本)。

    • 注意GNUsed確實支持\n替換字符串,這將簡化命令:... | sed 's/Q[0-9]/\n&/g'
  • 替換字符串佔位符&代表一切匹配的正則表達式(根據POSIX)。

    • 這使得不需要定義捕獲組,你嘗試過,並引起你的問題亦隨$'...'(見下文)。

至於你試過

通過使用$'...'逃逸引入的額外層 「吃」 的\字符。在Q\([0-9]\),使得sed看見Q([0-9]),其中 - 在不存在非標準選項-E的激活擴展正則表達式(ERES) - 引起()被作爲普通字符(它們處於basic regular expression (BRE),其sed處理默認使用)。

因此,無捕獲組中擴大到空字符串替換字符串定義,和\1

2

如果你像我一樣厭倦了所有那些sed變體(gnu,freebsd,open bsd,macos),那麼有一個解決方案:使用perl -pe替換。
在所有機器中工作相同,語法與gnu sed幾乎相同。 所以這是Debian測試,以及做工精細也是你的機器:

echo "...." |perl -pe 's/Q([0-9])/\nQ\1/g' 
+2

...還是有點短'的perl - pe's /(Q \ d)/ \ n $ 1/g'' :) – jm666

+0

@ jm666 Great tip!謝謝! –

+2

@ jm666:或者,根本不需要使用捕獲組:'perl -pe's/Q \ d \ \ n $&/ g''。 – mklement0

0

GNU sed的

sed 's/Q\([0-9]\)/\nQ\1/g' 

sed 's/Q[0-9]/\n&/g' 
+1

你需要指出,這個解決方案只適用於GNU Sed而不是其他版本的sed(如freebsd sed,openbsd sed,mac os sed等)。根據OP的sed語法判斷,似乎OP沒有使用GNU Sed,所以這個解決方案在他的機器上不起作用,除非他決定安裝gnu sed。 –

相關問題