複数のファイルから1行置換

複数のファイルから1行置換

ディレクトリにいくつかのテキストファイルがあります。それらはすべてさまざまな文字列を持っていますが、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

質問にタグを付けてLinuxGNU / 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. 行だけが要求に一致して変更され、他の行は変更されません。

スクリーンショット

sedlineが正しい行でXXX有効な16進文字列で、二重引用符が含まれている場合にのみ置き換えます"..."。他のスペースや他の文字がある場合、行は変更されていません。単語Acct-Session-Idは大文字と小文字を区別します。ファイル名が最後の引数として渡され、対応する./*.txt行が置き換えられます。-i

関連情報