2016-09-28 64 views
1

背景

展望更換隻能在文字美元符號是由美元符號(從來沒有跨越線)界定時期。例如:結合正則表達式模式來匹配組分隔字符串內

Names: $annie.bettie.cindy.dannie.ellie$. Only $a$ names. $a.b.c.d.e.f$. 

問題

following regex幾乎工作,但過於簡單:

/([[:alnum:]])\.([[:alnum:]])/g 

如果存在匹配的分隔符($)之外,再過多將被取代。

以下的正則表達式:

/\$.*?\$/g 

Matches and groups的分隔字符串:

名稱:$ annie.bettie.cindy.dannie.ellie $。只有$ a $的名字。 $ a.b.c.d.e.f $

問題

如何將二者結合起來的正則表達式,這樣的時間段可以用另一個字符串替換?例如:

Names: $annie.bettie.cindy.dannie.ellie$. Only $a$ names. $a.b.c.d.e.f$. 

最終將變爲:

Names: `r v$annie$bettie$cindy$dannie$ellie`. Only `r v$a` names. `r v$a$b$c$d$e$f`. 

我有是匹配的分隔點麻煩。

正則表達式將從運行bash的終端傳遞到sed。

+2

也許[該SO線索](http://stackoverflow.com/questions/25241413/pass-the-匹配值函數和替換值與返回值)可以拋出一些光。 –

+1

你能解釋你的預期產出嗎?問題聲明說你需要在'$ sometext $'模式中用'$'替換'。',特別是我沒有在模式結束時得到'''''''''' – Sundeep

+0

@Sundeep:目標是創建一個正則表達式,將簡單的[Pandoc](http://pandoc.org/)YAML變量引用轉換爲更強大的內聯[knitr](http://yihui.name/knitr/)表達式。 –

回答

1

這可能爲你工作(GNU SED):

sed -r ':a;s/^(([^$]*\$[^$.]*\$)*[^$]*\$[^$.]*)\./\1\n/;ta;s/(\$[^$]*)\$/`r v\1`/g;y/\n/$/' file 

由換行符替換組內的所有時段。插入組前綴和後綴字面量,然後將換行符轉換爲美元。

1
$ cat ip.txt 
Names: $annie.bettie.cindy.dannie.ellie$. Only $a$ names. $a.b.c.d.e.f$. 

$ perl -pe ' 
BEGIN 
{ 
    sub f 
    { 
     $a = $_[0] =~ tr/./$/r; 
     $a =~ s/^/`r v/; 
     $a =~ s/.$/`/; 
     return $a; 
    } 
} 
s/\$.*?\$/f($&)/ge 
' ip.txt 
Names: `r v$annie$bettie$cindy$dannie$ellie`. Only `r v$a` names. `r v$a$b$c$d$e$f`. 
  • 子程序f進行必要的改造爲$sometext$字符串 - 第一音譯.$,再加入一些字符串開頭和最後刪除最後一個字符與格式要求
    • 子程序是取代放入一個BEGIN區塊,該區塊在逐行處理輸入文件之前執行
  • s/\$.*?\$/f($&)/ge將提取$sometext$模式並傳遞到f子例程。的Perl知道調用它禮貌e標誌
  • -p開關裝置輸入行之後的所有獲取打印命令