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를 $
시도했지만 아무것도 작동하지 않는 것 같습니다.sed
awk
답변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
"완료될 때까지 반복" 루프가 필요 없이 필요에 따라 적절한 수의 별표를 생성합니다.