簡體   English   中英

如何使用字符串和隨機生成的數字替換文件中的標頭值?

[英]How do I replace the header value in a file with a string and a randomly generated number?

我有一個目錄中的文件,如下所示:

aaa   bbbbb   cccc  value1=xxxxxvalue2=yyyy
body body body
body body body 
body body body 
aaa   bbbbb   cccc  value1=xxxx

如何使用字符串(sevens.eighteen。下面)和隨機生成的長度為20的數字(下面的11234567890123456789)替換標題中“value1 =”和“value2 =”之間的所有內容?

例如:aaa bbbbb cccc value1 = sevens.eighteen.11234567890123456789 = yyyy

我嘗試了以下的變體,但我沒有得到我想要的東西。

sed -i '1 s/^.*value=/yoursubstitution value=/; $ s/^.*value=/yoursubstitution value=/'

以下是我希望在該目錄中的所有文件中看到的結果:

aaa   bbbbb   cccc  value1=sevens.eighteen.11234567890123456789value2=yyyy
body body body
body body body 
body body body 
aaa   bbbbb   cccc  value1=xxxx

有一個文件。

# create a 20 digit random number with bash
for ((i=0;i<20;i++)); do num="${num}${RANDOM: -1:1}"; done

# replace string with GNU sed
sed -E '1 s/(value1=).*(value2=.*)/\1sevens.eighteen.'"$num"'\2/' file

輸出:

aaa   bbbbb   cccc  value1=sevens.eighteen.39489360437938728734value2=yyyy
body body body
body body body 
body body body 
aaa   bbbbb   cccc  value1=xxxx

創建隨機數字的方法有很多種:

RAND_NR="$(tr -cd "[:digit:]" < /dev/urandom | head -c 20)"

然后你可以使用sed替換值:

sed "s/value1=.*value2=/value1=sevens.eighteen.${RAND_NR}value2=/" file

sed雙引號用於擴展變量RAND_NR。

輸出:

aaa   bbbbb   cccc  value1=sevens.eighteen.76744539817863807290value2=yyyy
body body body
body body body 
body body body 
aaa   bbbbb   cccc  value1=xxxx

使用GNU awk為第3個arg匹配()和-i inplace進行“inplace”編輯,你只需要這個命令:

$ cat tst.awk
BEGIN { srand(seed) }
(FNR==1) && match($0,/(.*value1=).*(value2=.*)/,a) {
    $0 = a[1] "sevens.eighteen." int(10000000000000000000 + rand()*90000000000000000000) a[2]
}
{ print }

$ awk -i inplace -v seed="$RANDOM" -f tst.awk *

例如:

$ awk -v seed="$RANDOM" -f tst.awk file
aaa   bbbbb   cccc  value1=sevens.eighteen.77242153065798582272value2=yyyy
body body body
body body body
body body body
aaa   bbbbb   cccc  value1=xxxx

$ awk -v seed="$RANDOM" -f tst.awk file
aaa   bbbbb   cccc  value1=sevens.eighteen.59551444957943291904value2=yyyy
body body body
body body body
body body body
aaa   bbbbb   cccc  value1=xxxx

請注意,上述操作僅適用於每個輸入文件的第一行,因此即使正則表達式在另一行上匹配,也不會更改。

我看到你問了另一個相同的問題,而不是你想要的第一行和最后一行。 只需將改變$ 0的代碼移動到一個函數,因為你現在需要調用它兩次並保存/更改前一行而不是當前行,這樣你就可以在ENDFILE中使用最后一行(也是一個GNU awk擴展) :

$ cat file
aaa   bbbbb   cccc  value1=xxxxxvalue2=yyyy
body body body
body body body
body body body
aaa   bbbbb   cccc  value1=xxxx,value2=yyyy

$ cat tst.awk
BEGIN { srand(seed) }
NR==1  { fmt() }
NR > 1 { print prev }
{ prev = $0 }
ENDFILE { fmt(); print }

function fmt() {
    if ( match($0,/(.*value1=).*(value2=.*)/,a) ) {
        $0 = a[1] "sevens.eighteen." int(10000000000000000000 + rand()*90000000000000000000) a[2]
    }
}

$ awk -v seed="$RANDOM" -f tst.awk file
aaa   bbbbb   cccc  value1=sevens.eighteen.55152151176931606528value2=yyyy
body body body
body body body
body body body
aaa   bbbbb   cccc  value1=sevens.eighteen.98796005800472494080value2=yyyy

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM