ディレクトリにいくつかのテキストファイルがあります。それらはすべてさまざまな文字列を持っていますが、1つの文字列はすべて同じです。
Acct-Session-Id = "XXXXXXXX-XXXXXXXX"
ここで、X - 16進形式の記号です。
すべてのファイルで、この ID を任意の XXXXXXXX-XXXXXXXX 番号に置き換える必要があります。番号はすべてのファイルで同じでなければなりません。交換後は、同じ名前でファイルを保存する必要があります。
sedにしてみましたが、成功しませんでした...
答え1
このようにしてくださいアッ:
id=$(openssl rand -hex 8 | sed 's/./-&/9')
awk -v id=$id '$1 == "Acct-Session-Id"{$3="\042"id"\042"}1' file
出力
Acct-Session-Id = "f7ea78e0-1eeb7b09"
それから:
id=$(openssl rand -hex 8 | sed 's/./-&/9')
while IFS= read -r f; do
awk -v id=$id '$1 == "Acct-Session-Id"{$3="\042"id"\042"}1' "$f" > /tmp/tmp$$
mv /tmp/tmp$$ "$f"
done < <(grep -l 'Acct-Session-Id' .)
別の解決策は次のとおりです。真珠(ループと一時ファイルは必要ありません):
export id=$(openssl rand -hex 8 | sed 's/./-&/9')
perl -i -lane '
$F[2] = "\042$ENV{id}\042" if $F[0] eq "Acct-Session-Id";
print join " ", @F
' files*
答え2
質問にタグを付けてLinux
GNU / Linuxに言及すると仮定すると、次のスクリプトを書くことができます。
#! /bin/sh -
IFS= read -r uuid < /proc/sys/kernel/random/uuid || exit
id=${uuid%-*-*}
id=${id%-*}${id##*-}
grep -rl --null -e 'Acct-Session-Id = ".*"' -- "$@" |
xargs -r0 sed -i -e 's/\(Acct-Session-Id = \)"[^"]*"/\1"'"$id"'"/g' --
次のように呼び出されます。
path/to/that-script path/to/dir-or-file path/to/other/dir-or-file...
答え3
sed 1行
id=$(hexdump -vn8 -e '4/1 "%02x" "-"' /dev/urandom);
sed -ri 's,^Acct-Session-Id = "[[:xdigit:]]{8}-[[:xdigit:]]{8}"$,Acct-Session-Id = "'"${id%?}"'",' ./*.txt;
cat /dev/urandom
任意のバイトを出力します。
hexdump
ファイルの16進数ビューを印刷します。
-v
=ヌルバイトを抑制しません。
-n <length>
=最初のnバイトのみ(head -cと同じ)
-e 4/1
形式%02x
(2桁の数字)で、1行に4バイトx 1を出力します。-
so値で区切ると、id
次のようになりますcf41f825-8b1e4c1c-
(残念ながら末尾-
)。
sed -i
./*.txt はすべてのファイルを編集し、
's,^find$,'replace','
その単語を検索します。「探す」^
行の先頭に行を含める必要があり、行は
単語の直後に終わる必要があり$
(完全行と正確に一致する必要があります)、
'replace'
変数を解析するには行を引用符で囲む必要があります
("$id"
一重引用符では評価されません)。
すべての文字列を一致させるには^
削除できます。$
[[:xdigit:]]
16進数のバイトと一致します0-f
(thx @GillesQuenot)。
{8}
前のバイトは連続して8回存在する必要があります。
${id%?}
出力で文字列操作を使用して末尾のワイルドカード$id
のシングルバイトで発生した場合、
%
最短項目を削除するため、IDを変更するには、次のようにします。
?
cf41f825-8b1e4c1c
この例では、1.+3. 行だけが要求に一致して変更され、他の行は変更されません。
sed
lineが正しい行でXXX
有効な16進文字列で、二重引用符が含まれている場合にのみ置き換えます"..."
。他のスペースや他の文字がある場合、行は変更されていません。単語Acct-Session-Id
は大文字と小文字を区別します。ファイル名が最後の引数として渡され、対応する./*.txt
行が置き換えられます。-i