문자열 뒤의 문자 바꾸기
Nov 16 2020
S-123-P Bash Pocket Ref. 2010 Cengage Learning $55
E-P234 Python Pocket Ref. 2012 Cengage Learning $45
55-MNP Unix System Programming 2001 Sybex $230
with를 $
포함하지 않는 뒤에 숫자를 바꿔야 하므로 출력은 다음과 같아야합니다.$
*
S-123-P Bash Pocket Ref. 2010 Cengage Learning $**
E-P234 Python Pocket Ref. 2012 Cengage Learning $**
55-MNP Unix System Programming 2001 Sybex $***
마지막 숫자 또는 마지막 2를 바꿀 수 있었지만 $
. 나는 시도 sed
하고 awk
gsub했지만 내가 시도하는 것은 작동하지 않는 것 같습니다.
답변
6 αғsнιη Nov 16 2020 at 02:42
sed
탭 / 공백 또는 필드 의도를 건드리지 않는 이점을 사용할 수 있습니다 .
sed -E ':a s/(\$\**)[^*]/\1*/; ta' infile
모든 대체 ($<zero-or-more-*>)[<non-*-character>]
와를 $<zero-or-more-*><plus-additional-*-added>
( \1*
; \1
에 제 유사한 그룹으로 다시 참조 인 sed
으로 정의 (...)
)까지 모두 <non-*-character>
치환 s는 *
S.
약간 복잡하지만 마지막 필드에서만 변경을 강제하려는 경우 다음과 같이 명령을 사용할 수 있습니다.
sed -E ':a s/(\$\**)[^*]([^$]*)$/\1*\2/; ta' infile
4 steeldriver Nov 16 2020 at 02:47
awk / gsub-마지막 필드의 십진수를 바꿀 수 있다고 가정합니다. $
예를 들어 123$45 -> 123$**
다음 과 같은 것을 처리 할 필요가 없습니다 .
awk '$NF ~ /\$[0-9]+/ {gsub(/[0-9]/,"*",$NF)} 1' file
2 hobbs Nov 16 2020 at 12:09
Perl은 사용할 수있는 경우이를 수행하는 좋은 방법을 제공합니다.
perl -lpe 's/\$([0-9]*)/"\$" . "*" x length($1)/e'
이것은 /e
"완료 될 때까지 반복"루프를 요구하는 대신 필요에 따라 적절한 수의 별표를 생성하기 위해 정규식 대체의 대체 부분이 고정 문자열 ( 플래그)이 아닌 Perl 표현식이되도록하는 기능을 활용 합니다.