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=

관련 정보