2012-10-18 25 views
1

我有,其行是在[aiou]'存儲與sed中的模式匹配的整行的變量是什麼?

gia' 
giacche' 
giovedi' 
giu' 

結束意大利的話,我要替換這些行與AutoHotkey的命令,讓我用一個單引號寫下這些文字,並自動將它們在正確的翻譯文件版本,那就是我想要的

::gia'::già 
::giacche'::giacché 
::giovedi'::giovedì 
::giu'::giù 

我知道我可以用sed完成這項工作,但是我無法完成它的工作。我知道有一個變量來存儲整條線,但我找不到它。如果是@以下可能工作

sed -e "s/.a'/::@::@\b\bà/" temp 
sed -e "s/.i'/::@::@\b\bì/" temp 
sed -e "s/.o'/::@::@\b\bò/" temp 
sed -e "s/.u'/::@::@\b\bù/" temp 

請注意,雖然該行是按照字母順序,他們不都開始克,也不存在這個詞的最後兩個字符的模式。

那麼你知道我在找什麼變量嗎? 您認爲我的問題比我嘗試的更好嗎?

回答

2

你正在尋找的變量是&。也許是這樣的:

sed -e "s/\(.*\)a'/::&::\1à/" temp 

您也可以串所有的命令一起爲所有五個元音:

sed -e "s/\(.*\)a'/::&::\1à/" -e "s/\(.*\)e'/::&::\1é/" -e "s/\(.*\)i'/::&::\1ì/" -e "s/\(.*\)o'/::&::\1ò/" -e "s/\(.*\)u'/::&::\1ù/" temp 

如果你有GNU sed

sed -re "s/(.+)a'/::&::\1à/" -e "s/(.+)e'/::&::\1é/" -e "s/(.+)i'/::&::\1ì/" -e "s/(.+)o'/::&::\1ò/" -e "s/(.+)u'/::&::\1ù/" temp 
+0

我嘗試使用&符號,但沒有奏效,因爲我沒有在那裏放置圓括號。 這是什麼意思? 編輯:嗯,括號似乎並不重要的匹配。但是,他們呢? –

+0

括號可以讓你分組。例如,正則表達式:'\(。* \)a'表示捕獲所有東西直到'a'並將其存儲在組中。這個組叫做'\ 1'。你使用'GNU sed'嗎? – Steve

+0

@FerdinandoRandisi:我已經用適合我的'GNU sed'解決方案更新了答案。 '-r'標誌啓用了擴展正則表達式(因此您不需要轉義括號,並且給了我們一些其他選項,包括一次或多次與'+'符號匹配的能力,而不是零或者多次使用'*'符號 - 我想這也許是你要找的東西)。 – Steve

1

這可能會實現爲你(GNU sed):

sed -r '1{x;s/^/aàeéiìoòuù/;x};/[aeiou]'\''$/!b;G;s/((.*)(.).)\n.*\3(.).*/::\1::\2\4/' file 

說明:

  • 1{x;s/^/aàeéiìoòuù/;x}儲存在文件的開頭
  • /[aeiou]'\''$/!b保釋出來的保留空間(HS)的查找表,除非所期望的字結尾
  • G追加一個換行符和HS的內容到模式空間(PS)
  • s/((.*)(.).)\n.*\3(.).*/::\1::\2\4/使用原始單詞中的最後一個字符作爲查找附加查找表中的查找,並生成所需的輸出