을 사용하고 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=