2013-09-25 32 views
1

我用它來創建一個字符串:如何將AWK的輸出作爲變量存儲在BASH腳本的SED命令中使用?

awk -F "|" 'NR==1 {print $2$4}' file 

我現在想用這個字符串使用SED另一個字符串,使用此代碼,這是我知道的作品來代替:

sed -i.bak 's/\(<remote>\).*\(<\/remote>\)/<remote> http:\/\/blabla\/'$var' <\/remote>/g' file2.xml 

但我想不出的是如何將awk的輸出保存爲$ var首先用作SED的輸入。誰能幫忙?謝謝。

+0

以上sed的命令將含糊失敗var'的'各種設置。 –

回答

2

不要那樣做,只是用awk,如:

awk -F'|' ' 
NR==FNR { if (NR==1) var = $2$4; next } 
{ gsub(/<remote>.*<\/remote>/,"<remote> http://blabla/" var " </remote>"); print } 
' file file2.xml > tmp && mv tmp file2.xml 

隨着GNU awk的你可以使它更有效率,但除非你的第一個文件很大,否則它不會有明顯的區別:

awk -F'|' ' 
NR==FNR { var = $2$4; nextfile } 
{ gsub(/<remote>.*<\/remote>/,"<remote> http://blabla/" var " </remote>"); print } 
' file file2.xml > tmp && mv tmp file2.xml 

WRT評論我在別人的崗位上做出了,這裏就是爲什麼你應該我們-v var=val代替填充在AWK的args列表變量,除非你需要做的是改變文件(BEGINFILE的GNU AWK禮貌沒有必要之間的初始值):

以下腳本保存在3個文件中的值添加到一些初始種子值和打印結果爲每個文件,並在所有文件(種子是剛剛添加一次總)。 file2是空的:

$ cat file1 
3 
6 
$ cat file2 
$ cat file3 
2 
5 
$ cat tst.awk         
BEGIN { 
    print "seed value =", seed 

    for (i=1; i<ARGC; i++) 
     subtotal[ARGV[i]] = seed 

    total = seed 
} 

{ 
    subtotal[FILENAME] += $0 
    total += $0 
} 

END { 
    for (filename in subtotal) 
     print "File", filename, "subtotal =", subtotal[filename] 

    print "total =", total 
} 
$ 
$ awk -v seed=7 -f tst.awk file1 file2 file3 
seed value = 7 
File file1 subtotal = 16 
File file2 subtotal = 7 
File file3 subtotal = 14 
total = 23 

一切正常嗎?現在,讓我們繼續前進的「種子」的設置到參數列表:

$ awk -f tst.awk seed=7 file1 file2 file3   
seed value = 
File file1 subtotal = 9 
File file2 subtotal = 
File file3 subtotal = 7 
File seed=7 subtotal = 
total = 16 

注意的種子值從第一打印缺失,小計和總錯了,有一個輸出要打印的值一個名爲「seed = 7」的文件。

這一切都是可以解釋和預測的,一旦你確切地知道你在用awk做什麼,但我敢打賭,這對於一個新來者來說真是莫名其妙,所以恕我直言填充變量在arg列表中不應該是我們建議人們默認初始化它們的變量因爲它比-v variable=value要少得多的直觀語義。

+1

用於'下一個文件'的+1 – user000001

+0

第一個和第二個awk語句都完全按照我的要求。謝謝!我現在需要做更多的事情;我想讀取'file'的行,並且對於每一行,在他們自己唯一的'file.xml'上執行這個操作,它已經存在,它的位置由'file'中的'$ 6'給出。這可能嗎? – user2815969

+0

是的,任何文本處理都是可能的。用您的新要求發佈一個新問題,樣本輸入和預期輸出。 –

1
var=$(awk -F "|" 'NR==1 {print $2$4}' file) 

但它更好,你給我們提供了數據和如何處理它。這樣我們就可以做出awk或sed來完成這一切。

編輯:

var="test" 
echo "https://blabla/bla/bla </remote>" | awk '{$NF="</"v">"}1' v="$var" 
https://blabla/bla/bla </test> 

這將替換$ VAR價值的東西

+0

那也不太工作....桑達不再接受變量,當我有VAR =前字符串沒有問題。所以我需要做的就是替換這個元素的內容:通過分隔2場的組合//布拉布拉/ BLA/BLA'「|」:' HTTPS。由於數據的內容,我是新來的,所以盡我所能,也不能過多細節。謝謝 – user2815969

+1

查看我的關於如何使用awk讀取變量的更新 – Jotne

+0

恕我直言,你應該只在awk arg列表中設置變量,如果它們需要在文件之間切換,並且你要在awk參數列表中設置變量,你應該至少確保你正在回覆的人瞭解使用'-v variable = value'這樣做的負面影響。 –

相關問題