2015-09-11 50 views
0

我綁轉換匹配的模式,以降低的情況下,我用下面的awk代碼,但它是做替換,但也增加了換行符替換後字轉換匹配的模式,以較低的情況下,AWK

awk 'BEGIN{ FS = "[&]";RS = ";"; };{ $2 = tolower($2) }{print $0}' test.txt 

測試文件內容:

This is test file & replacing ' PATTERN 

輸出我得到的是:

This is test file & 
    replacing ' 
    PATTERN 

回答

0

正如埃德莫頓指出的那樣,這是壞了。

你要確保OFSORS是相同的分別爲FSRS

當您修改RS時,Awk將更改其的讀數行爲;但除非您也更改ORS,否則寫入行爲將保持爲默認值,即將換行符作爲記錄分隔符進行打印。

正如Ed Morton指出的那樣,您還需要將FS更改爲單個字符&以使您的程序正常工作。但是,通過這個固定的,我得到了預期的產出。

vnix$ awk 'BEGIN{ OFS = FS = "&"; ORS = RS = ";"; };{ $2 = tolower($2) }{print $0}' <<':' 
> This is test file &AMP; replacing &APOS; PATTERN 
> :  
This is test file &amp; replacing &apos; PATTERN 
&; 

一個聰明的解決方案,這已經是95%的榮譽。

+0

不,那將分號添加到末尾從文件末尾剝離換行符,並用'[&]'s替換所有'&'s。不知道爲什麼OP接受了這個答案。 –

+0

最後我沒有看到分號,雖然你說FS'最好改爲「&」'。更新答案。感謝您的評論。 – tripleee

+0

你正在設置'ORS =';''然後執行'print $ 0',這樣輸出不能以分號結束。您發佈的輸出中缺少輸出的「&」部分,它將在下一行的提示符之前出現。 –

1

也許這符合您的需求更好地

awk '{for(i=1;i<=NF;i++) if("&"==substr($i,1,1)) $i=tolower($i)}1' 

轉換開始符號的所有單詞小寫。

或者,如果你想指定第一和最後一個字符的匹配

awk '{for(i=1;i<=NF;i++) if(match($i,"&.*;")) $i=tolower($i)}1' 

˚F

+0

不需要substr()和match(),你可以用'$ i〜/ ^&/'和'$ i〜/ &.*; /'來代替(最後是match()應該真的被錨定'$ i〜/^&.*; $ /')。 –

1

我沒有看到一個簡單的一行來實現這一目標。或許短腳本:

{ 
    while (match($0, /&[A-Z]+;/)) { 
    tag=substr($0,match($0,/&[A-Z]+;/)+1); tag=substr(tag,0,index(tag,";")); 
    $0=substr($0,0,match($0,/&[A-Z]+;/)) tolower(tag) substr($0,match($0,/&[A-Z]+;/)+length(tag)+1); 
    } 
} 

1 

此步驟通過輸入搜索大寫標記的每一行,併爲每一個發現,代替使用一組功能substr()線。

測試:

$ echo "This is test file &AMP; replacing &APOS; PATTERN" | gawk -f ~/doit.awk 
This is test file &amp; replacing &apos; PATTERN 

您可以在上面放一個「認領」,如果你希望能夠將此獨立運行。它可以在gawk或BSD awk中工作,所以它應該在大多數操作系統中都很開心。

+0

它在任何awk中的行爲都是一樣的。唯一的可移植性問題是在'[A-Z]'不代表'大寫字母'的語言環境中,您應該使用'[[:upper:]]'代替。 –

0

這是真的sed的工作:

$ sed -r 's/&[^;]+/\L&/g' file 
This is test file &amp; replacing &apos; PATTERN 

如果它是便攜式的awk那麼它會是:

$ awk '{rec=""; while(match($0,/&[^;]+/)) { rec = rec substr($0,1,RSTART-1) tolower(substr($0,RSTART,RLENGTH)); $0=substr($0,RSTART+RLENGTH)} print rec $0}' file 
This is test file &amp; replacing &apos; PATTERN 
+0

不幸的是,'-r'和'\ L'都不是可移植的,儘管這應該適用於現代Linux'sed'。 – tripleee

+0

好的,我添加了便攜式awk等價物。 –