我正在嘗試編寫一個bash腳本來刪除ini文件中的多行。我有一個ini文件,配置方式如下。查找給定行號後第一個匹配的行號
# There could be any text before the following text
[machine1.conn]
ipAddress=192.168.1.1
portNumber=11001
[machine2.conn]
ipAddress=192.168.1.2
portNumber=11002
[machine3.conn]
ipAddress=192.168.1.3
portNumber=11003
# There could be any text after the previous text
我想從ini文件(包括屬性)中刪除所有這些條目。
ini文件中可能有任意數量的「機器」條目,但對於本示例,我僅顯示3.括號內的標籤在ini文件中是完全唯一的,但每個後面的屬性顯然不是。我已經有了確定第一個[machine#.conn]
以及最後一個的行號的方法;假設這些分別被分配給變量$firstMachineLineNum
和$lastMachineLineNum
。我要做的是使用sed刪除從$firstMachineLineNum
到最後一臺機器的portNumber
行號的一系列行。我正在採取這種方向,sed -i '$firstMachineLineNum,$lastMachinesPortNumLineNum$d' file.ini
。爲此,我需要一種確定$lastMachinesPortNumLineNum
的方法,換句話說,在最後的[machine#.conn]
(在我的示例中爲[machine3.conn]
)之後的第一個匹配的行號爲portNumber
。理想情況下,我不需要依靠僅將2添加到$lastMachineLineNum
。
我該如何使用sed和/或grep最好地提取此行號?我是否把這個過於複雜化,並且有一個更簡單的方法?
你介意重寫那個使機器的標題可以是任何東西,只有'.conn'是靜態的?看起來像'sed'/^\[.*.\{1,\}\conn]/,/^\s*$/d'file.ini'工作正常(我還添加了一個'^'以確保它是匹配在行首)。我有沒有這個正確的,或者我在錯誤的地方有一個點? – user2150250
編輯 - 起初我以爲你的意思是使用一個變量的機器名稱,但後來我重新讀你的評論。我把兩個都放了。 (您的版本從'。'中刪除了'\',所以它不再意味着一段時間,並且會匹配任何字符,1次或更多次。) – William