Quindi uso "sed" su Linux da un po' di tempo, ma ho avuto un po' di difficoltà a provare a usarlo su OSX poiché "POSIX sed" e "GNU sed" hanno così tante piccole differenze. Attualmente sto lottando con come inserire una riga di testo dopo un certo numero di riga. (in questo caso, riga 4)
Su Linux farei qualcosa del genere:
sed --in-place "4 a\ mode '0755'" file.txt
Quindi su OSX ho provato questo:
sed -i "" "4 a\ mode '0755'" file.txt
Tuttavia, questo continua a darmi un errore "caratteri extra dopo \ alla fine di un comando". Qualche idea su cosa c'è che non va qui? Ho un errore di battitura? Oppure non capisco un'altra differenza tra le versioni di sed?
Risposta accettata:
A rigor di termini, la specifica POSIX per sed
richiede una nuova riga dopo a\
:
[1addr]a\ text
Scrivere il testo nell'output standard come descritto in precedenza.
Questo rende la scrittura di battute un po' una seccatura, che è probabilmente la ragione della seguente estensione GNU a a
, i
e c
comandi:
Come estensione GNU, se compresa tra a
e la nuova riga è diversa da uno spazio bianco-\
sequenza, quindi il testo di questa riga, a partire dal primo carattere non di spazi bianchi dopo il a
, viene presa come prima riga del testo bloccare. (Ciò consente una semplificazione nello scripting di un'aggiunta di una riga.) Questa estensione funziona anche con i
e c
comandi.
Quindi, per essere portabile con il tuo sed
sintassi, dovrai includere una nuova riga dopo a\
in qualche modo. Il modo più semplice è inserire semplicemente una nuova riga tra virgolette:
$ sed -e 'a\
> text'
(dove $
e >
sono prompt della shell). Se lo trovi fastidioso, bash
[1] ha il $' '
citando la sintassi per inserire gli escape in stile C, quindi usa semplicemente
sed -e 'a\'$'\n''text'
[1] e mksh (r39b+) e alcune shell bourne non bash (ad esempio, /bin/sh in FreeBSD 9+)