Na verdade, sed
pode funcionar perfeitamente, mas aqui estão mais algumas opções:
1. sed
sudo sed -i.old -r '/[ \t]\/[ \t]/{s/(ext4[\t ]*)([^\t ]*)/,user_xattr,acl,barrier=1/}' /etc/fstab
Explicação:
-
-i.old
: Edite o arquivo no lugar e criefstab.old
como backup do arquivo original antes das alterações. -
-r
: ativa as expressões regulares estendidas. -
/[ \t]\/[ \t]/{}
: Se esta linha corresponder a um/
rodeado por um espaço ou tabulação (se esta linha descrever o/
ponto de montagem). -
s/(ext4[\t ]*)([^\t ]*)/,user_xattr,acl,barrier=1/
:s/pat/replacement/
é o operador de substituição, ele substituirápat
porreplacement
. Aqui, nós estamos combinandoext4
e qualquer espaço ou tab seguinte (necessário para ancorar a correspondência, se os seus sistemas de arquivos não são ext4, você precisará mudar isso) e então capturar (é o que os parênteses fazem) o trecho mais longo de caracteres não brancos depois disso. Em outras palavras, capturando o campo de opções do fstab. Em seguida, substituímos aqueles com(o primeiro padrão capturado),
(o 3º padrão de capturaf, as opções originais) mais as opções extras que você deseja adicionar.
2. Perl
sudo perl -i.old -pane 's/$F[3]/$F[3],user_xattr,acl,barrier=1/ if $F[1] eq "/"' /etc/fstab
Explicação:
-
-i.old
: Novamente, isso fará com que o arquivo seja editado e um backup chamadofstab.old
será criado. -
-pane
:-p
significa imprimir cada linha,-a
divide automaticamente as linhas de entrada nos campos no espaço em branco e as salva como a matriz@F
.-n
significa ler linha por linha e-e
permite que você passe um script na linha de comando. - O script real adicionará as opções extras ao valor atual do quarto campo (
$F[3]
, primeiro campo é$F[0]
) somente se o segundo campo ($F[1]
, o ponto de montagem) for/
.
3. awk
sudo cp /etc/fstab /etc/fstab.old &&
awk '(=="/"){=",user_xattr,acl,barrier=1"}1;' /etc/fstab.old | sudo tee /etc/fstab
Explicação:
A maioria das versões de awk
não permite a edição em vigor, portanto, o primeiro comando criará uma cópia de backup. O awk
verificará, então, se o segundo campo é /
e, em caso afirmativo, adicionará o texto necessário ao quarto campo, as opções. O 1;
é um atalho do awk para "imprimir a linha". O sudo tee
é apenas um truque para permitir a impressão em /etc/fstab
, já que o simples redirecionamento não funcionará com sudo
.
4. puta pura
sudo cp /etc/fstab /etc.fstab.old
while read fs mp ty op du pa; do
[[ $mp = "/" ]] && op="user_xattr,acl,barrier=1,""$op";
printf "%s %s %s %s %s %s\n" "$fs" "$mp" "$ty" "$op" "$du" "$pa";
done < /etc/fstab.old | sudo tee /etc/fstab
Explicação
-
while read fs mp ty op du pa; do ...; done < /etc/fstab
: Leia cada linha fstab e divida nos campos relevantes. -
[[ $mp = "/" ]] && op="user_xattr,acl,barrier=1,""$op";
se o ponto de montagem for/
, adicione as opções extras a$op
. - O
printf
apenas imprime cada linha corretamente.