2013-04-16 62 views
0

我正在嘗試編寫一個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最好地提取此行號?我是否把這個過於複雜化,並且有一個更簡單的方法?

回答

1

桑達將做到這一點很容易不夠的,如果是如圖所示(您想刪除一個塊中沒有空行)的文件:

sed '/^\[machine[0-9]\{1,\}\.conn\]/,/^\s*$/d' file 

修改接受.conn結尾的名字:

sed '/^\[.*\.conn\]/,/^\s*$/d' file 
修改

可變目標線:

machine='machine1' 
sed '/^\['"$machine"'\.conn\]/,/^\s*$/d' file 
+0

你介意重寫那個使機器的標題可以是任何東西,只有'.conn'是靜態的?看起來像'sed'/^\[.*.\{1,\}\conn]/,/^\s*$/d'file.ini'工作正常(我還添加了一個'^'以確保它是匹配在行首)。我有沒有這個正確的,或者我在錯誤的地方有一個點? – user2150250

+0

編輯 - 起初我以爲你的意思是使用一個變量的機器名稱,但後來我重新讀你的評論。我把兩個都放了。 (您的版本從'。'中刪除了'\',所以它不再意味着一段時間,並且會匹配任何字符,1次或更多次。) – William

1

嘗試這一個班輪:

awk -v RS="" -v ORS="\n\n" '!/machine[0-9]+\.conn/' file 

小測試:

kent$ cat file 
[foo_keep] 
foo=foo 

[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 

[bar_keep] 
bar=bar 

[machine4.conn] 
ipAddress=whatever 
portNumber=11001 

[machine5.conn] 
ipAddress=whatever 
portNumber=11002 

[baz_keep] 
hhh=hhh 

輸出

kent$ awk -v RS="" -v ORS="\n\n" '!/machine[0-9]+\.conn/' file 
[foo_keep] 
foo=foo 

[bar_keep] 
bar=bar 

[baz_keep] 
hhh=hhh 
0

如果你想只排除此塊你可以使用這個:

awk 'NR < $firstline || NR > $lastline {print $0}' file.txt 
相關問題