を使用してawk
フィールドに入力しますが、FieldSeperator()が行を開始するのか、前にスペースがあるのか、前にスペースがないのかによって異なります。$1
$2
awk
$match
私はこれがsed
この特定の仕事のための最良の選択だと思いますが、助けが必要です。簡単な検索で得られるようで、行全体を変更する例をたくさん見ましたが、以下で何をすべきかわかりませんでした。誰でも私を助けることができればとても感謝します。
$match
私が探している一致()に設定された変数()を指定したいと思いますpassword=
。これは実際にさまざまなパターンを繰り返すバッチスクリプトに含まれています。
印刷したい:
- 一致する行のみが含まれます。一致しない行を無視します。
- 行の最初の一致値まで印刷します。
- 一致する値がある場合は、次のように置き換えます。
masked
- 一致するものの後に何もない場合は、その行をそのまま印刷します(またはに置き換えます
empty
)。 - 大文字と小文字を区別せずに一致するものを検索します。
ファイル.txt 入力
dummy line
mypassword=123
PASSWORD=1234
secret password=2345 2ndpassword=99485
password=
nothing to see move along
end of file
希望の出力
mypassword=masked
PASSWORD=masked
secret password=masked
password=
答え1
どうですか?
$ sed -nE '/(password|PASSWORD)=/{s/=.+/=masked/;p;}' infile.txt
mypassword=masked
PASSWORD=masked
secret password=masked
password=
- 一致
password=
するPASSWORD=
- 交換後に空でない文字シーケンス
=
- 結果の印刷
GNU sedを使用すると、修飾子を使用して大文字と小文字を区別しない一致を単純化できますI
。
sed -nE '/password=/I{s/=.+/=masked/;p;}' infile.txt
答え2
「defence」では、内部フラグとPOSIX文字クラス(GNU Awkに制限される可能性がある)を理解していると仮定して、次のことをawk
行う必要があります。awk
IGNORECASE
awk -v pat="$match" 'BEGIN{IGNORECASE=1;w=length(pat)} i=index($0,pat) {printf "%s%s%s",substr($0,1,i+w-1),substr($0,i+w)~/^[[:space:]]*$/ ? "" : "masked",ORS}' infile.txt
これにより、シェル変数がVariables$match
にインポートされます。このセクションでは、一致する大文字と小文字が無視されることを示すフラグが設定されます。awk
pat
BEGIN
IGNORECASE
awk
関数が検索パターンを正常に見つけることができる行のみを処理します。変数で特別な意味を持つ文字をindex()
避けるために、正規表現一致ではなくリテラル文字列一致を選択しました。正規表現検索が必要な場合は、この関数を使用してください。この場合、行の残りの部分が空白のみで構成されていない限り、最初からパターンを含む行を印刷してから単語を印刷します。$match
match()
masked
よりポータブルなバリエーションこの関数は、検索を実行する前にtolower()
行を小文字に変換するために使用されますindex()
(したがって、変数に検索文字列がすべて小文字で含まれていることを確認してください$match
)、POSIX文字クラスは使用しません。
awk -v pat="$match" 'BEGIN{w=length(pat)} i=index(tolower($0),pat) {printf "%s%s%s",substr($0,1,i+w-1),substr($0,i+w)~/^[ \t]*$/ ? "" : "masked",ORS}' infile.txt
これはすべてのバリエーションに適用されますawk
。
答え3
使用sed
$ sed -n '/password=/I{/=[[:alnum:]]/{s/\([^=]*=\).*/\1masked/};p}' input_file
mypassword=masked
PASSWORD=masked
secret password=masked
password=
答え4
/I
大文字と小文字を区別しない場合は、GNU sedとその修飾子を使用してください。
##> ensure $match is pluggable
## on the kha of a s/// and/or
## /../
match='password='
match_lhs=$(printf '%s\n' "$match" | sed -e 's:[*[$.\^/]:\\&:g')
sed -n "
/$match_lhs\$/Ip
s/\($match_lhs\)..*/\1MASKED/Ip
" infile.txt
mypassword=MASKED
PASSWORD=MASKED
secret password=MASKED
password=