2017-01-24 85 views
1

我想知道如何使用兩個'grep'和'sed'工具或其他東西來替換子字符串。我將在下面解釋我想要做的事情。如何在搜索某些特定字符串後使用grep和sed替換子字符串?

我們有文件 '的test.txt' 與下面的字符串:

A1 = 'AA1',A2 = 'AA2',A3 = 'AA3',A4 = 'AA4',A5 { ATTR} ='AA5',A6 ='keyword_A'

使用grep搜索'keyword_A'後,我想用其他字符串替換A5的值,例如「NEW」。

A1 = 'AA1',A2 = 'AA2',A3 = 'AA3',A4 = 'AA4',A5 {ATTR} = 'NEW',A6 = 'keyword_A'

我試圖使用兩個命令,如

grep keyword_A test.txt | sed -e 's/blabla/blabla/' 

經過嘗試我所知道的一切後,我完全放棄了。

請讓我知道正確的解決方案。

+0

另請參閱[sed doc此類問題的示例](https://stackoverflow.com/documentation/sed/3120/address-and-address-range#t=201701240411428268083) – Sundeep

回答

2

首先,你永遠不需要grep sed。 Sed有一個完整的正則表達式搜索引擎,所以它是grep的超集。該命令將讀取test.txt,改變你指定的線路,並打印在標準輸出的整個結果:

sed "/keyword_A/s/A5{ATTR}='[A-Z0-9]*'/A5{ATTR}='NEW'/g" < test.txt 

如果要存儲結果迴文件test.txt,使用-i(活就地編輯)切換到sed

sed "/keyword_A/s/A5{ATTR}='[A-Z0-9]*'/A5{ATTR}='NEW'/g" -i.bak test.txt 

如果您想選擇指示線,修改這些,並打印那些行到標準輸出,使用p(打印)命令和組合-n(無輸出)開關。

sed "/keyword_A/s/A5{ATTR}='[A-Z0-9]*'/A5{ATTR}='NEW'/gp" -n test.txt 
0

使用grep + sed總是錯誤的方法。下面是與GNU awk來做到這一點的一種方法:

$ awk '/keyword_A/{ $0=gensub(/(A5({[^}]+})?=\047)[^\047]+/,"\\1NEW",1) } 1' file 
A1='AA1', A2='AA2', A3='AA3', A4='AA4', A5{ATTR}='NEW', A6='keyword_A' 
0

使用幾個變量,你可以定義關鍵字和更換(如果他們改變的話):

q="keyword_A" 
r="NEW" 

然後用sed

sed -r "s/^(.+\{.+\}=')(.+)('.+"${q}".+)$/\1"${r}"\3/" file 

結果:

A1='AA1', A2='AA2', A3='AA3', A4='AA4', A5{ATTR}='NEW', A6='keyword_A' 
0
A5="NEW" 
A6="keyword_A" 

# with sed 
sed "s/='[^']*\(',[[:blank:]]*A6='${A6}'\)/='${A5}\1/" YourFile 

# with awk 
awk -F "'" -v A5="${A5}" -v A6="${A6}" ' 
    BEGIN { OFS="\047" } 
    $12 == A6 { $10 = A5; $0 = $0 } 
    7 
    ' YourFile 
  • 由字符串,SED的端部變化和使用'在AWK字段分隔符,而不是傳統的空間。
  • 假設存在價值沒有'(或者需要治療的逃逸方法)awk的版本
0

時刺痛keyword_A發現我們只要直接替換列第五位,如下圖所示:

awk -F, 'BEGIN{OFS=",";}/keyword_A/{$5="A5{ATTR}='"'"NEW"'"'"}1' filename 
0

一些略微的替代品:

sed -r "/keyword_A/s/(A5[^']*')[^']*/\1NEW/" 

awk -F"'" '/keyword_A/{$10 = "NEW"}1' OFS="'" 

當然負的AWK是事後你將不得不重命名新文件。