![](/img/trans.png)
[英]How do I replace the header and trailer of all files in a directory with a new header and trailer string, but only up to a certain character?
[英]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.