진주

진주

특정 단어 뒤의 모든 문자를 별표( )로 바꾸는 스크립트를 작성해야 합니다 *. 예를 들어:

sed 's/Word:[^ ]\+/Word:*/' Desktop/script_test

하지만 이 스크립트는 단어 전체를 별표로만 바꾸는 반면, 저는 모든 문자를 바꾸고 싶습니다. 어떻게 해야 하나요? 예를 들어 다음 입력을 사용합니다.

Word: cat

난 갖길 원해

Word: ***

저는 리눅스를 사용하고 있습니다.

PS 입력은 텍스트 파일에서 읽어야 하며 동일한 파일에 저장되어야 합니다.

답변1

루프에서 한 번에 하나씩 이 작업을 수행할 수 있습니다.

sed -e :1 -e 's/\(Word: *[^ ]*\)[^ *]/\1*/;t1'

파일을 내부에서 편집하고 교체할 모든 문자가 단일 바이트라고 가정하려면 다음과 같이 sed의 stdin 및 stdout을 모두 파일에 설정하면 됩니다.

sed ... < file 1<> file

또는 GNU sed를 사용하려면 -i다음과 같이 이 플래그를 사용하세요.

sed -i ... file

(이렇게 하면 파일이 새 파일로 대체됩니다(비록 이름은 같지만). BSD sed의 경우 -i ''대신 를 사용하십시오 -i).

답변2

어때요?

$ cat file
Word: cat
Word: foobar
$ sed -E 's/Word: *//; s/./*/g; s/^/Word: /' file
Word: ***
Word: ******

파일을 수정하려면 다음을 사용하세요 -i.

$ sed -E -i 's/Word: *//; s/./*/g; s/^/Word: /' file

Word:줄의 첫 번째 단어가 아닌 경우에는 작동하지 않습니다. 이것이 문제라면 다음을 사용할 수 있습니다.

perl -pe 's/Word:\s*\K(\S+)/sprintf "*" x length($1)/e' file

차례로, Word:각 행의 첫 번째 항목을 원한다고 가정해 보겠습니다.모든 것이후에 로 바꾸십시오 *. 첫 번째 단어만 바꾸려면 Word:새로운 질문을 하거나 최소한 질문을 명확히 해야 합니다.

답변3

sed를 사용하면 다음과 같이 이를 달성할 수 있습니다.

echo 'Word: cat' |
sed -e '
   s/Word:/&\n/
   :loop
      s/\n\([^a-zA-Z]*\)[a-zA-Z]/\1*\n/
   tloop
   s/\n\([^a-zA-Z]*\)$/\1/
' 

답변4

진주

echo 'Word: cat' |
perl -lpe '
   1 while s/(?<=Word:)([^a-zA-Z]*)([a-zA-Z]+)/$1 . "*" x length($2)/e;
'

불다

eval "`echo 'NL=qsq' | tr 'qs' '\047\012'`"; # newline
echo 'Word: cat' |
while IFS= read -r line
do
   var=${line/Word:/Word:"$NL"}
   var1=${var#*"$NL"}     var2=${var%"$NL"*}
   var3=${var1//[a-zA-Z]/*}
   var4=${var2}${var3}
   printf '%s\n' "$line" "$var4"
done

관련 정보