Primeiro, não leia as linhas de um arquivo com for
Eu li isso em algum lugar sobre a divisão de strings: use split
quando você sabe o que jogar fora; use uma expressão regular quando você souber o que deseja manter. Ou algo assim.
O problema com o uso da divisão de palavras shell usando $IFS
é que qualquer caractere nessa variável é usado para dividir, e você não pode saber qual deles.
Com o bash, você pode escrever:
line='Hello there! How are you doing? How is life? Mine is as boring as a winter morning!'
line=${line//\?/$'"?\n'}
line=${line//\!/$'"!\n'}
echo "$line"
Hello there"!
How are you doing"?
How is life"?
Mine is as boring as a winter morning"!
Observe os espaços principais. Isso pode ser contornado com um padrão mais complicado: line=${line//\?*([[:blank:]])/$'"?\n'}
Eu usaria sed
:
line='Hello there! How are you doing? How is life? Mine is as boring as a winter morning!'
new=$( sed 's/[?!][[:blank:]]*/&\n/g' <<<"$line" )
echo "$new"
Hello there!
How are you doing?
How is life?
Mine is as boring as a winter morning!
awk tem uma função split()
que permite capturar o separadores, mas usá-lo é bem detalhado:
echo "$line" | awk '{
n = split($0, words, /[!?][[:blank:]]*/, seps)
for (i = 1; i < n; i++)
print words[i] seps[i]
print words[n]}
'