Até onde eu sei, \s
é uma expressão regular em Perl que é igual a [[:blank:]]
em sed
. Dentro de [ ... ]
, \s
significa "um \
e um s
". Observe também que, mesmo que [^\s]+
fosse igual a [^␣]+
, isso não teria correspondido a Status Update
devido ao espaço intermediário.
A substituição substituirá toda a correspondência com o primeiro grupo entre aspas duplas. Você provavelmente quer pegar todas as três colunas ou você acabará com somente a última coluna. E, como você está tentando corresponder a linha inteira, você deve ancorar a expressão no começo e no final com ^
e $
e descartar a g
no final.
Alternativa:
$ sed -E 's/[[:alpha:]].+/"&"/' myfile
12 42956 "Cinema - 3D/Multiplex "
7 12560 "Status Update "
5 184 "Movie "
Isso localizará a última coluna pelo fato de que seus dados parecem sempre começar com um não dígito. A expressão simplesmente corresponderá ao restante da linha do primeiro caractere alfabético e substituirá toda a correspondência por uma versão com aspas duplas da correspondência.
Os dados da questão tinham espaços no final e as aspas incluiriam esses. Para evitar os espaços no final:
$ sed -E -e 's/[[:blank:]]*$//' -e 's/[[:alpha:]].+/"&"/' myfile
12 42956 "Cinema - 3D/Multiplex"
7 12560 "Status Update"
5 184 "Movie"
Alternativamente,
while read -r a b c; do printf '%d\t%d\t"%s"\n' "$a" "$b" "$c"; done <myfile
12 42956 "Cinema - 3D/Multiplex"
7 12560 "Status Update"
5 184 "Movie"