2013-11-02 24 views
5

如果我有一個文件中的以下列表:桑達:如何替換找到一個特定的模式位於文件後的字符串

integer, parameter :: ni = 1024 
integer, parameter :: nj = 256 
integer, parameter :: nk = 16 

,並希望基於字符串「NI =」進行搜索,然後用例如'512'的新字符串替換後面的字符串(本例中爲'1024')(我想保留空格)。我該如何使用sed?請注意,我希望基本上擦除等號後的任何內容,這是因爲有時字符串不會是一個簡單的整數,它可能類似於'1.D0'。在某些情況下,可能會有評論。所以我只想消除等號前面的任何內容,並用新值替換。

其結果將是:

integer, parameter :: ni = 512 
integer, parameter :: nj = 256 
integer, parameter :: nk = 16 

回答

9

GNU sed的支持擴展的正則表達式,如果你給它-r標誌。

sed -re 's/(:: ni =)[^=]*$/\1 512/' file 

更好的是,匹配多個空格。

sed -re 's/(::\s+ni\s+=)[^=]*$/\1 512/' file 

\1是什麼在括號()相匹配的參考,所以我們用\1和新的值替換。

1
sed -e 's/:: ni = [0-9][0-9]*$/:: ni = 512/' 

這看起來周邊的規定,以儘量減少在另一個字符串中的某個地方找到ni的機會匹配合理的範圍內。

+0

編寫'sed -e's/:: ni = [0-9] + $/:: ni = 512 /'' –

+0

@AntonAstafiev更好:這取決於你希望代碼的工作範圍。 'sed'的某些變體支持'+'而不需要進一步的切換;許多人不這樣做,POSIX也不要求他們這樣做。你可以使用'[0-9] \ {1,\}'來做到這一點,但我寫的更容易理解。 –

3

如果我理解正確的話,這樣的事情應該這樣做:

sed 's/\(ni = \).*/\1REPLACEMENT/'

相關問題