2016-07-29 135 views
0

我有一個文件中的一些文字,看起來像這樣:使用sed和awk替換搜索文本中的文本?

BLAHBLAHBLAH RANDOM DATA 
    data = [ 
      #'oink', 
      #'bigger oink', 
      #'stronger oink', 
      #'strongest oink', 
      #'beyond godlike oink' 
     ] 
    BLAHAHAHA RANDOM LASDKFJS DATA 

我試圖刪除的數據陣列中的所有#的,在我第一次嘗試我嘗試這樣做:

sed -i "s/#'/'/g" file 

這很好用 - 但是,它在數據[]範圍之外進行搜索。

然後我試着用AWK SED結合:

awk '/data = \[/,/\]/' file | sed -i "s/# '/'/g" 

這不起作用,因爲sed的是沒有得到的輸入文件。

我該如何結合這些,或者我怎樣才能用一個命令呢?

回答

1

保持簡單:

awk '/data = \[/{f=1} f{sub(/#/,"")} /\]/{f=0} 1' file 

例如,借款@ anubhava的輸入和按摩,包括有#引用文本中的一行:

$ cat file 
# text 
BLAHBLAHBLAH RANDOM DATA 
    data = [ 
      #'oink', 
      #'bigger oink', 
      #'stronger oink', 
      #'mother #$^*@ oink', 
      #'beyond godlike oink' 
     ] 
    BLAHAHAHA RANDOM LASDKFJS DATA 

      #'stronger oink', 
      #'strongest oink', 

$ awk '/data = \[/{f=1} f{sub(/#/,"")} /\]/{f=0} 1' file 
# text 
BLAHBLAHBLAH RANDOM DATA 
    data = [ 
      'oink', 
      'bigger oink', 
      'stronger oink', 
      'mother #$^*@ oink', 
      'beyond godlike oink' 
     ] 
    BLAHAHAHA RANDOM LASDKFJS DATA 

      #'stronger oink', 
      #'strongest oink', 

以上將與任何AWK上工作任何OS。

0

沿着這些方向的東西應該可以工作,但是請注意它會在以data = [開頭並以]結尾的任何塊中進行替換。你真的不說你的數據文件是否可能有多個這樣的塊...

awk '/^[ \t]*data = \[[ \t]*$/ { replacing = 1 } 
    /^[ \t]*\][ \t]*$/  { replacing = 0 } 
    replacing     { sub("# '\''", "'\''") } 
           { print } 
    ' <input.txt> output.txt 
1

使用了GNU AWK,你可以這樣做:

cat file 

# text 
BLAHBLAHBLAH RANDOM DATA 
    data = [ 
      #'oink', 
      #'bigger oink', 
      #'stronger oink', 
      #'strongest oink', 
      #'beyond godlike oink' 
     ] 
    BLAHAHAHA RANDOM LASDKFJS DATA 

      #'stronger oink', 
      #'strongest oink', 

# awk command 
awk -v RS='data *= *\\[[^]]*\\]' '{gsub(/#/, "", RT); print $0 RT}' ORS= file 

# text  
BLAHBLAHBLAH RANDOM DATA 
    data = [ 
      'oink', 
      'bigger oink', 
      'stronger oink', 
      'strongest oink', 
      'beyond godlike oink' 
     ] 
    BLAHAHAHA RANDOM LASDKFJS DATA 

      #'stronger oink', 
      #'strongest oink', 
      #'beyond godlike oink' 
+0

我想只刪除#符號,而不是整個行。 – Taztingo

+0

它似乎並沒有被做任何事情'數據= [ \t \t \t# 'activeCfg', \t \t \t# 'cellBroadcastSchedule', \t \t \t# 'surveyCfg', \t \t \t# 'targetsCfg', \t \t \t# 'scheduledOp' \t \t]' – Taztingo

+0

確定嘗試:'AWK -v RS = '數據* = * \\ [[^]] * \\]'「{GSUB(/#/「 「,RT);打印$ 0 RT}'文件' – anubhava

0

你可以試試這個sed

sed "/^\s*data = \[/{:loop; /\]/b; n; s/#'/'/g; t loop}" file 

測試:

$ sed "/^\s*data = \[/{:loop; /\]/b; n; s/#'/'/g; t loop}" file 
BLAHBLAHBLAH RANDOM DATA 
    data = [ 
      'oink', 
      'bigger oink', 
      'stronger oink', 
      'strongest oink', 
      'beyond godlike oink' 
     ] 
    BLAHAHAHA RANDOM LASDKFJS DATA