2014-10-09 54 views
0

以下是我想要在一行中執行的操作:
1.搜索與模式不匹配的行在文件ak.txt,替換每一行\<the negate matched line\>\|vim和sed單行:反向搜索,多重搜索替換行,打開文件並在vim編輯器中高亮顯示

$ sed -n '/.*[0-9][0-9]\.[0-9][0-9]\.[0-9][0-9][0-9]$/!s:.*:\\\<&\\\>\\\|:p' ak.txt 

輸出:

\<ee integration_01.32.00\>\| 
\<ration_01.2.000\>\| 
\<gon_1.21.000\>\| 
\<dkei_ting-on_1.2.00\>\| 
\<see integration instructions\>\| 

以上的作品,我不想上,雖然最後一行的最後兩個字符...
2。問「VIM」到多個突出取代線搜索,會拋出錯誤,下面是命令:

$ vim -c "/`sed -n '/.*[0-9][0-9]\.[0-9][0-9]\.[0-9][0-9][0-9]$/!s:.*:\\\<&\\\>\\\|:p' ak.txt`" -c 'set hls' ak.txt 

錯誤:

bash: .: unrecognized history modifier 

我想我們得到了什麼,我試圖讓,我們如何告訴BASH通過VIM和SED?

+1

在雙引號字符串中有一個感嘆號,這是bash討厭的。用'「'!'」'替換它。 – Ryan 2014-10-09 01:35:34

+0

@minitech發現一個sed異常:'sed:-e表達式#1,字符45:未知命令:''''' – AjayKumarBasuthkar 2014-10-09 01:47:39

回答

0

如果你必須這樣做在同一行,則:

sed -n '/.*[0-9][0-9]\.[0-9][0-9]\.[0-9][0-9][0-9]*$/!{ s:.*:\\\<&\\\>\\\|:; $s/\\|$//; p; }' ak.txt 

或:

sed -n '/.*[0-9][0-9]\.[0-9][0-9]\.[0-9]\{3\}*$/!{ s:.*:\\\<&\\\>\\\|:; $s/\\|$//; p; }' ak.txt 

這需要你的基本操作,但使用{}到第3個動作。首先是你的替代操作,保持不變(我試圖將:改爲/,但沒有)。第二個只匹配文件的最後一行,並刪除似乎是您的主要目標的尾部\|。第三個操作打印該行。

如果最後一行實際上與最後一行的dd.dd.ddd匹配(其中d代表一個數字),則會出現問題。如果這是一個問題,你可能必須使用兩個sed命令(你可以把它寫在一行,如果這就是你想要的,但我把它寫在一行上):

sed -n '/.*[0-9][0-9]\.[0-9][0-9]\.[0-9][0-9][0-9]$/!s:.*:\\\<&\\\>\\\|:p' ak.txt | 
sed '$s/\\|$//' 

第一行就是你原來的命令;第二個簡單地刪除最後一行末尾的\|