문자열 뒤의 문자 바꾸기

문자열 뒤의 문자 바꾸기
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자리를 바꿀 수 있었지만 gsub를 $시도했지만 아무것도 작동하지 않는 것 같습니다.sedawk

답변1

sed탭/공백 또는 필드 의도를 건드리지 않는 이점을 누릴 수 있습니다 .

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

($<zero-or-more-*>)[<non-*-character>]모든 s가 s 로 바뀔 때까지 각각을 $<zero-or-more-*><plus-additional-*-added>( \1*;는 \1정의에서 첫 번째로 일치하는 그룹에 대한 역참조입니다)로 바꿉니다 .sed(...)<non-*-character>*


조금 복잡하지만 마지막 필드만 강제로 변경하려면 다음과 같이 명령을 사용하면 됩니다.

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

답변2

awk/gsub 사용 - 마지막 필드에서 다음으로 시작하는 소수점 자리를 바꿀 수 있다고 가정하면 $다음과 같은 작업을 처리할 필요가 없습니다 123$45 -> 123$**.

awk '$NF ~ /\$[0-9]+/ {gsub(/[0-9]/,"*",$NF)} 1' file

답변3

Perl은 이를 수행하는 좋은 방법을 제공합니다(있는 경우).

perl -lpe 's/\$([0-9]*)/"\$" . "*" x length($1)/e'

이는 정규식 대체의 대체 부분을 고정 문자열(flag)이 아닌 Perl 표현식으로 만드는 기능을 활용하여 /e"완료될 때까지 반복" 루프가 필요 없이 필요에 따라 적절한 수의 별표를 생성합니다.

관련 정보