入力と同じ長さのランダム文字列を生成して、固定長テキストファイルの電子メールアドレスを表示したいと思います。 sedで文字列を逆参照として渡しています。
簡単にするために、このスクリプト(一時)は次のとおりです。
#!/bin/zsh
IFS=$'\n' # make newlines the only separator
set -f # disable globbing
#show me the input from the command line
echo $1 ${#1}
function randString() {
# just echo for demonstration
echo $1 ${#1}
# this is the bit I really want:
# cat /dev/urandom | LC_ALL=C tr -cd "[a-z]" | head -c${#1}
}
for line in $(cat $1); do
echo $line |
sed "s/\([a-zA-Z0-9]\{2,\}\)@\([a-zA-Z0-9]\{2,\}\)\.\([a-zA-Z0-9]\{2,\}\)/$(randString \\1)@$(randString \\2).$(randString \\3)/"
done
次のデータ(temp.txt)を使用してください。
me [email protected]
you [email protected]
次のように実行します。
./temp temp.txt
私に次のような出力を与えます。
temp.txt 8
me myemail 2@someserver 2.com 2
you youremail 2@anotherserver 2.biz 2
問題は、${#1}
どの文字列を入力しても2が返されることです。長さ$1
が正しくない正しい文字列をどのように返すことができますか${#1}
?IFS
ファイルの繰り返し設定により機能が終了しますか?
注:私はMacを使用しているので、GNU拡張はありません。
ベストアンサー1
いくつかの診断ビットは何が起こっているかを示します。
この行を関数echo rand $1 ${#1} >&2
に追加すると、出力は次のようになります。randString
temp.txt 8
rand \1 2
rand \2 2
rand \3 2
me myemail 2@someserver 2.com 2
rand \1 2
rand \2 2
rand \3 2
you youremail 2@anotherserver 2.biz 2
stderr
入力をwithにエコーすることで、逆参照が表示する必要がある文字列の代わりに引数、および(長さ2)を使用して呼び出されていることが>&2
わかります。randString
\1
\2
\3
次のテストは、呼び出しの前にsed
withを追加して、echo
どの引数を受け取るかを確認することです。出力:
sed s/\([a-zA-Z0-9]\{2,\}\)@\([a-zA-Z0-9]\{2,\}\)\.\([a-zA-Z0-9]\{2,\}\)/\1 2@\2 2.\3 2/
このようにして、sed
文字列を\1 2
入力文字列の逆参照であるthatのように置き換え、その後にスペースと数字2を入力するように求められます。入力Eメールアドレスの文字列は関数でsed
はなくから来ます。echo
これは、文字列が引数として渡される前に$(...)
文字列のコマンド置換(拡張)が処理されるためです。入力文字列を関数に渡すには、シェル関数を呼び出す必要があります。しかし、おそらくこれを行う方法はありません。zsh
sed
sed
基本バージョンsed
。
編集が追加されました:デフォルトでは、メールアドレスを編集するためのクイックスクリプトzsh
:
#!/usr/bin/env zsh
setopt extendedglob
coproc cat /dev/urandom | LC_ALL=C tr -cd "[:lower:]"
getRand (){
print -r -- ${1//(#m)[[:alnum:]]/$(read -psk var;echo $var)}
}
while read line; do
print -r -- ${line/(#m)[[:alnum:]](#c2,)@[[:alnum:]](#c2,).[[:alnum:]](#c2,)/$(getRand ${MATCH})}
done < ${1:?}