2014-05-12 132 views
0

我需要從用戶輸入行中刪除/刪除註釋而不刪除任何代碼。例如:Unix/Linux,刪除行註釋

mail -s 'text' brown < text #comments 

如何刪除註釋並保持代碼不變? 我可以刪除以#開頭的行,但如果它從行中間的某個位置開始,則不能刪除。

我想:

echo $line | sed -e 's/\ 

,但它不工作。任何想法我做錯了什麼?

另外,如何檢測#未用於開始評論的情況? 例如引用#和以#結尾的代碼行,因爲它們不是註釋。

echo $line | sed -e '/^#/d' 

在這一行中,#不用作註釋,而是用作代碼的一部分。我發現我需要檢測,如果#在引號內或在#之前沒有空格字符。我該如何離開輸出?

+0

我想知道您是如何認爲您可以自動從我的帖子中的示例文件中刪除評論的。 – Jotne

+0

除非您考慮到shell腳本的詞法結構,否則不可能完成這項工作。你需要處理單引號字符串,雙引號字符串,變量擴展例如'$#'和'$ {#variable}'和'$ {variable#head}',這裏是文檔(作爲開始)。當你能夠準確地檢測到它們時,在他們所有的榮耀中(記住,引用的字符串可以延伸到多行!),然後你就可以開始檢測評論。請注意'echo a#b'回顯三個字符加一個換行符。 –

回答

2

您可以刪除所有從#使用此awk

awk '{sub(/#.*$/,"")}1' file 

結束行,但如果你有文件是這樣的:

#!/bin/bash 
pidof tail #See if tail is running 
if [ $? -ne 0 ] ; then #start loop 
    awk '{print " # "$8}' file >tmp # this is my code 
fi # end of loop 
awk -F# '{for (i=1;i<=NF;i++) print $i}' file > tmp2 
a=a+1 # increment a 

有沒有辦法可以自動刪除評論無摧毀一些。

+0

是的,但問題是它也會刪除不屬於評論部分的內容。例如:代碼/#/代碼。由於#是代碼的一部分,我不希望它從該行中刪除任何內容。 – chipunpui

+0

@chipunpui你可以告訴我程序應該如何看待'#'作爲註釋的區別,而不是代碼的某個部分。然後你需要一些邏輯來理解文本是關於代碼的人類信息。 – Jotne

+0

請注意,這破壞了$#'或$ {#variable}'或其他各種使用'#'的構造,更不用說包含'#'的引用字符串了。 –

0

那麼,考慮一下在bash中發表評論之後幾乎總是會出現這種情況。

#comment... 
#another comment 

換行符!這實際上是一個角色。所以,你所要做的就是在你的#後加一個通配符,以包含實際的註釋文本,然後在結尾處加上換行符「字符」。 您實際上需要使用\ n而不是嘗試按Enter鍵。 不幸的是,我現在不在linux上,有時分隔符(反斜槓)無法正常工作。 嘗試像\ n這樣的東西可能會起作用,或者可能使用$'\ n'。

編輯:與正則表達式^將指示新行的開始,而$表示結束。

至於沒有刪除實際的代碼,匹配緊跟#的空間應該工作。我會匹配#前面的空格或換行符。

無論如何,請不要意外破壞您正在處理的任何事情,以防萬一我錯了。

+0

不,這正是我所要求的。我只是不知道如何,因爲我仍然在學習sed/awk。我最初認爲要逐字符地解析字符串,並檢查#之前的字符是空格還是換行符,但這是很多工作。 – chipunpui