sed が一致するテキストを置き換えます。

sed が一致するテキストを置き換えます。

を使用してawkフィールドに入力しますが、FieldSeperator()が行を開始するのか、前にスペースがあるのか​​、前にスペースがないのかによって異なります。$1 $2awk$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行う必要があります。awkIGNORECASE

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にインポートされます。このセクションでは、一致する大文字と小文字が無視されることを示すフラグが設定されます。awkpatBEGINIGNORECASEawk

関数が検索パターンを正常に見つけることができる行のみを処理します。変数で特別な意味を持つ文字をindex()避けるために、正規表現一致ではなくリテラル文字列一致を選択しました。正規表現検索が必要な場合は、この関数を使用してください。この場合、行の残りの部分が空白のみで構成されていない限り、最初からパターンを含む行を印刷してから単語を印刷します。$matchmatch()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=

関連情報