他の人が指摘したように、sed はこのタスクにはあまり適していません。もちろん可能です。スペースで区切られた単語を含む単一行で機能する例を次に示します。
echo "She sells sea shells by the sea shore" |
sed 's/ /\n/g' | sed '/^[Ss]h/ s/[^[:punct:]]/./g' | sed ':a;N;$!ba;s/\n/ /g'
出力:
... sells sea ...... by the sea .....
最初の「sed」はスペースを改行に置き換え、2 番目はドットを付け、3 番目はこの回答に示すように改行を削除します。
予測できない単語区切りや段落がある場合、このアプローチはすぐに手に負えなくなります。
編集 - 複数行の代替
Kent のコメント (GNU sed)に触発された、複数行の入力を処理する 1 つの方法を次に示します。
echo "
She sells sea shells by the sea shore She sells sea shells by the sea shore,
She sells sea shells by the sea shore She sells sea shells by the sea shore
She sells sea shells by the sea shore She sells sea shells by the sea shore
" |
# Add a \0 to the end of the line and surround punctuations and whitespace by \n
sed 's/$/\x00/; s/[[:punct:][:space:]]/\n&\n/g' |
# Replace the matched word by dots
sed '/^[Ss]h.*/ s/[^\x00]/./g' |
# Join lines that were separated by the first sed
sed ':a;/\x00/!{N;ba}; s/\n//g'
出力:
... sells sea ...... by the sea ..... ... sells sea ...... by the sea .....,
... sells sea ...... by the sea ..... ... sells sea ...... by the sea .....
... sells sea ...... by the sea ..... ... sells sea ...... by the sea .....