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