2016-10-05 23 views
0

我希望在特定文件中使用sed在該行的開頭添加'#'。該腳本將在.sh文件中運行,而不是鍵入控制檯。如何在Linux Bash腳本文件中使用'sed'來將特定行與標籤間距註釋掉?

auth [success=1 default=ignore]  pam_unix.so nullok_secure 

應該是:

#auth [success=1 default=ignore]  pam_unix.so nullok_secure 

我目前正試圖類似的命令:

sudo sed -e '/auth[[:tab:]][success=1[[:space:]]default=ignore][[:tab:]]pam_unix.so[[:space:]]nullok_secure/ s/^#*/#/' -i /etc/pam.d/common-auth 

我知道上面的命令是錯誤的,因爲[[:tab:]]是不是一個有效的命令。我只想顯示選項卡的位置。

任何幫助表示讚賞!謝謝!!!

回答

0

它的工作原理...

sed -e '/^auth\t\[success=1\ default=ignore\]\tpam_unix.so\ nullok_secure/ s/^/#/' -i file 

我只是用的\t代替[[:tab:]]

而且\代替[[:space:]]

+1

「Linux」非常廣泛,因此這可能適用於某些Linux並在其他Linux上失敗。哪個'sed'版本是這個? – tripleee

+0

這對我有效!萬分感謝! – jmoneygram

1

在Ubuntu上,您可以使用\t作爲選項卡,我相信甚至可以在POSIX中指定它。

/auth\t\[success=1 default=ignore\]\tpam_unix.so nullok_secure/ 

我想我已經運行到這樣做對BSD雖然問題,但如果你真的不關心它正是一個標籤,並會接受,即使它有其他類型的空間您可以將行更靈活一點

/auth[[:space:]]\+\[success=1 default=ignore\]pam_unix.so[[:space:]]nullok_secure/ 

這是一個GNU主義的\+是指一個或多個前面的符號,更POSIX-Y,你可以做到這一點

/auth[[:space:]][[:space:]]*\[success=1 default=ignore\]pam_unix.so[[:space:]]nullok_secure/ 

(並注意Ť hat [:space:]字符類不包含空格字符,它是一組包含製表符的空格字符。)

另請注意,我們必須在您匹配的模式中跳過[,否則它將會定義一個要匹配的字符類,這當然不是你在這裏嘗試的。

作爲另一種選擇,假設你common-auth看起來像我的,這是一個已經success=1就可以了,所以你可以只使用,唯一的線,雖然它更加脆弱,如果其他人做出一些時間更改文件。

+0

這工作呢!非常感謝! 我以前一直在嘗試'''\ t''',但是我遇到了其他一些錯誤的事情。 再次感謝! – jmoneygram

-1

你正在對自己做出這樣的努力。 authconfig文件是標準的,不需要你使用的所有正則表達式。

sed -i 's/^auth [success=1 default=ignore]  pam_unix.so nullok_secure/#auth [success=1 default=ignore]  pam_unix.so nullok_secure/' /etc/pam.d/common-auth 

如果你真的想要具體,但我不會使用空間和標籤查找。只要看看你想要的文字和中間的空格。

+0

根據另一個答案中的註釋,'['字符是一個正則表達式元字符,需要轉義。也許你還應該描述如何使用文字標籤(如果你在編輯器中編寫腳本,很容易,需要在許多交互式shell中使用ctrl-V secret)。 – tripleee

+0

此外,重複逐字替換文本是有點富有。 OP的腳本在這方面更好;或者你可以簡單地在替換中使用'&'來引用整個匹配的文本。 – tripleee

+0

感謝您的回覆!無法得到這個工作,雖然:/我的上述表達式中的正則表達式是從我使用的以前的命令剩下的,只是爲了防萬一。再次感謝您的幫助! – jmoneygram

相關問題