珀尔

珀尔

我需要创建一个脚本,用星号 ( ) 替换某个单词后面的所有字母*。例如:

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

但这个脚本只用一个星号替换整个单词,而我想替换所有字母。我怎样才能做到这一点?例如,使用以下输入:

Word: cat

我想要得到

Word: ***

我正在运行Linux。

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

相关内容