2010-05-31 142 views
1

我有以下文件示例的sed的grep的+忽略#和匹配

more somefile 

param=a b c d e f g z x w 

# param=a b c d e f g z x w 

我需要創建的sed以下(應該是一條線,如果可能的話):

  1. 忽略#字符在一行的開頭
  2. 符合帕拉姆串
  3. 第二場比賽的「a b c d e f g z x w」(如grep -w),並給予退出狀態,如果成功

喜歡的東西....

sed "/^ *#/b; /\<param\>/" .... 

回答

0

的第一項刪除線,在一開始以 '#'。 目前還不清楚爲什麼你想要兩個術語匹配參數和尾隨材料(爲什麼不是一個?)。 您是否想要打印匹配線還不清楚。 現在還不清楚,你可以從sed獲得一個退出狀態,指示是否有任何行匹配了模式 - 你會被告知是否能夠執行腳本並打開所有文件,但僅此而已。與所有那些警告,則:

sed -n '/^#/d;/param=a b c d e f g z x w/p' somefile 

這將打印匹配的行,忽略(-n)那些不這樣做。


如果周圍有「=」號獲准空間,您可以修改搜索模式,以便對:

sed -n '/^#/d;/param *= *a b c d e f g z x w/p' somefile 

目前尚不清楚是否有「價值」裏面的間隔部分至關重要;如果不是,則可以使用適當的'*'(空格,空格,星號;標記編輯器再次工作得太緊),以允許可變空白。

但是,如果您想要類似grep的狀態,則可能需要使用grep。正如我注意到的 - sed不會返回'找到模式'或'找不到模式'的狀態,因爲這不是它所關心的。


如果你真的想sed做兩場比賽,那麼你必須進入分組操作,這不再是一個單一的行腳本。

sed -n '/^#/d;/param/{ 
     /a b c d e f g z x w/p 
     }' somefile 

這是說:

  • 刪除行以 '#'。
  • 找到包含'param'的行時,
  • 爲'a b c ...'行執行單獨的匹配,只打印找到的結果。

注意:正如所寫的,第一次模式匹配會找到'xyz = param'和'parameter = a b c';如果這不是您想要的,請適當修改該模式。第二種模式也會發現'g h a a b c d ... x w';如果這不是你想要的,你必須適當地修改它。

我想你可能會更好使用sed去除註釋和空行,然後使用grep序列來查找你的值。您必須使用GNU grep;其他計算機上的grep的POSIX標準版本(Solaris,AIX,HP-UX等)不支持-w選項。即使使用grep的順序,你有沒有線,如區分:

param=a b c d e f g z x w 
a b c d e f g z x w=param 

而且,沒有這樣的參數名之前前導空格,沒有它允許標籤,而不是空白。而且,即使參數名稱是固定的,值也可能有所不同,但是必須有懷疑的餘地。把它變成一個可用的shell腳本(調用sed或grep或兩者)增加了要考慮的細節。


  • 搜索給定的文件(參數3起)的一般形式爲「名稱=值」,其中名稱是參數1和值的條目是參數2,忽略註釋行以「#開始',並允許可變間距(但沒有選項卡)圍繞名稱和等號;值之前或之後不得有任何數據。

這導致:

if [ $# -lt 3 ]; then echo "Usage: $0 name value file [...]" 1>&2; exit; fi 
name=$1 
value=$2 
shift 2 

sed -n -e '/^#/d' -e "/ *$name *= *$value *$/p" "[email protected]" 

現在,如果這個腳本稱爲paramfinder,我可以這樣寫:

paramfinder param 'a b c d e f g z x w' somefile 

我也可以寫:

paramfinder param '.*a b c d *e f g *z x w.*' somefile 

注我已經將正則表達式元字符傳遞給了sed腳本中的值。

需要注意的是,如果我通過這將打破:

paramfinder passwordfile /etc/passwd somefile 

這是因爲在「/ etc/passwd文件」的斜線打破了正則表達式匹配。根據您的真實需求(是家庭作業還是生產問題 - 它必須具有多強大的功能),您可能會考慮轉移到某處某處的Perl(或Python或您選擇的其他類似腳本語言) 。

+0

對不起,但我需要首先匹配參數 ,如果匹配第二個馬克的「abcdefgzxw」 yael – yael 2010-05-31 08:12:19

+0

sed必須單獨匹配參數和「abcdefgzxw」,因爲有時參數字符串之間有一些空格「=」分隔符 yael – yael 2010-05-31 08:15:23

+0

類似於: sed -i「/^* #/ B;/\ <$PARAM\> /需要匹配abcdefgzxw」 – yael 2010-05-31 08:21:08

0

您可以通過使用嵌套的大括號做sedAND條件:

sed -n '/\<param\>/ { /^[[:space:]]*#/ ! { /\<a \+b \+c \+d \+e \+f ... \>/ p}}' 

這是說一個行匹配,如果:

  • 它包含單詞PARAM
  • AND不(! )以任何空格後面的註釋字符開始
  • AND有一個「字」,它是由一個或多個空格

分隔的字符序列的測試成功,你需要看看結果是不是空字符串:

if [[ -n $(sed ...) ]]