다음과 같은 데이터가 포함된 파일이 있습니다.
파일의 데이터:
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
*