특수 문자 "$" 뒤의 모든 숫자를 "*"로 바꾸는 방법

특수 문자 "$" 뒤의 모든 숫자를 "*"로 바꾸는 방법

다음과 같은 데이터가 포함된 파일이 있습니다.

파일의 데이터:

axbnx $56 ghjas $78$
axbnx $5** ghjas $ 
axbnx $006 ghjas $$678 

다음 형식의 출력이 필요합니다.

axbnx $** ghjas $**$
axbnx $*** ghjas $ 
axbnx $*** ghjas $$*** 

내 코드: [작동하지 않습니다]

sed -E 's/$[[:digit:]]/*/g'

이 에뮬레이터로 작업해 보세요:https://rextester.com/l/bash_online_compiler

답변1

그리고perl

$ perl -pe 's/\$\K\d+/$&=~s|.|*|gr/ge' ip.txt
axbnx $** ghjas $**$
axbnx $*** ghjas $ 
axbnx $*** ghjas $$*** 
  • \$\K\d+문자 앞에 오는 숫자와 일치합니다 $( 에서 일치 부분의 일부가 되는 \K것을 방지함 ).$$&
  • $&=~s|.|*|gr일치하는 부분의 각 문자를 다음으로 바꾸십시오.*
  • e교체 부품에 Perl 코드 사용을 허용하는 플래그

당신은 또한 사용할 수 있습니다perl -pe 's/\$\d+/$&=~tr|0-9|*|r/ge'

답변2

GNU awk를 사용하여 match() 및 gensub()에 세 번째 인수를 전달합니다.

$ awk '{while ( match($0,/(.*)(\$[0-9]+)(.*)/,a) ) $0=a[1] gensub(/[0-9]/,"*","g",a[2]) a[3]} 1' file
axbnx $** ghjas $**$
axbnx $*** ghjas $
axbnx $*** ghjas $$***

답변3

작은 변화를 조정하세요이전 질문에 대한 내 답변과 관련하여, [^*]별표가 아닌 문자를 [0-9]숫자로 변경하려면 다음을 수행하십시오.

sed -E ':a s/(\$\**)[0-9]/\1*/; ta' infile

$***123변환되지 않거나 댓글에서 지적한 것만 큼 좋지 않은 패턴을 유지하려는지는 잘 모르겠지만 $이러한 패턴 뒤의 첫 번째 문자를 이와 같이 변경하고 $<Uniq-character-or-string>*나머지를 변경하는 것을 방지하려면 다음 명령을 사용하여 모드를 이전 상태로 복원합니다.

sed -E ':a s/\$\*/$Uniq*/;ta;
        :b s/(\$\**)[0-9]/\1*/; tb;
        :c s/\$Uniq\*/$*/; tc;
' infile

답변4

다음 프로그램은 awk"다음에 하나 이상의 숫자가 오는" 패턴의 숫자를 다음과 같이 계속해서 대체합니다.$*

awk '{do {$0=gensub(/(\$\**)[[:digit:]]/,"\\1*","g");} while ($0~/\$\**[[:digit:]]/)}1' input.txt

$" 뒤에 0개 이상의 *숫자, 다음 숫자" 패턴을 "숫자 앞의 모든 항목, 다음 숫자 *"( 호출)로 바꾸고 검색 패턴이 더 이상 발생하지 않을 때까지 반복하여 gensub()이를 수행합니다 .

호출의 구문 은 패턴 , 0개 이상 및 단일 숫자를 검색 하고 해당 숫자(괄호로 묶음) 이전의 모든 항목을 "캡처 그룹"에 저장하도록 gensub()지시합니다 . 이 패턴의 대체 텍스트에서 이 "캡처 그룹"은 그대로 참조 되고 복사되지만 숫자는 생략되고 리터럴로 대체됩니다.awk$*\\1*

관련 정보