sed, comment faire pour remplacer une ligne avec 2 ligne?
Je suis en train de remplacer 1 ligne 2 lignes à l'aide de sed dans debian et voici ce que j'ai trouvé:
sed -i 's/You are good/You are good\n You are the best/g' /output.txt
Cependant, quand je fais cela, sed gardé de se plaindre en disant: option inconnue "s".
Quelqu'un pouvait aider?
Merci!
J'ai oublié de mentionner, c'est pour un script shell et de l'environnement est Debian 6
Juste un commentaire général, je suggère d'utiliser
Bravo pour le séparateur - j'ai été poussant ce depuis des années, malheureusement, un exemple de chaque sed vous verrez jamais utilise / comme séparateur - ce qui est le plus inutile de caractère à choisir. OK, étant donné que vous pouvez utiliser n'importe quel char, " e " est peut-être pire - sed 'sesom\estring avec un \ee/\el\ephantsee'
Juste un commentaire général, je suggère d'utiliser
#
au lieu de /
pour votre caractère délimiteur de sed, comme une règle générale. Parfois, vous aurez envie d'utiliser /
comme un délimiteur dans le cas de la modification d'un fichier ou d'un flux qui contient #
s (par exemple pour les commentaires dans une bashscript). Mais le plus souvent (dans mon expérience au moins), vous pourrez modifier le texte sans #
s, mais avec /
dans le cadre d'un Linux dir. la cotation. Si vous utilisez le signe de la livre, vous n'aurez pas à vous inquiéter au sujet de la délimitation (bien que d'autres délimitant les règles s'appliquent). Voici un brut ex.: echo '/a/' | sed -e 's#/a/#//#g'
vs echo '/a/' | sed -e 's/\/a\//\/\//g'
Bravo pour le séparateur - j'ai été poussant ce depuis des années, malheureusement, un exemple de chaque sed vous verrez jamais utilise / comme séparateur - ce qui est le plus inutile de caractère à choisir. OK, étant donné que vous pouvez utiliser n'importe quel char, " e " est peut-être pire - sed 'sesom\estring avec un \ee/\el\ephantsee'
OriginalL'auteur AZhu | 2011-08-16
Vous devez vous connecter pour publier un commentaire.
À essayer si vous êtes dans bash:
Étrange, hein? Mais semble fonctionner. Peut-être sed ne peut pas gérer le retour à la ligne correctement de sorte qu'il doit être échappés avec une autre barre oblique inverse, donc
\\
qui deviendront une seule\
avant d'aller au sed.Notez également que vous n'étiez pas en passant une extension de
-i
.Modifier
Viens de trouver une autre solution. Que le saut de ligne doit être échappé lors du passage de sed (sinon, il pense que c'est un indicateur de fin de commande) vous pouvez réellement utiliser les guillemets simples et de retour, il suffit d'insérer la barre oblique inverse avant d'entrer dans le caractère de saut de ligne.
juste mis à jour par un autre 🙂
OriginalL'auteur sidyll
Ou, au lieu de rechercher et remplacer (
s
de commande), de la recherche et de l'append (a
commande)comment puis-je commencer la nouvelle ligne avec des espaces? dire que je suis en train de modifier un fichier YAML
OriginalL'auteur glenn jackman
EDIT:
Probablement mon préféré de la méthode à l'heure actuelle est d'utiliser un caractère spécial à la place de '\n'. Citer des règles d'obtenir un mal de tête quand vous êtes en passant autour d'une chaîne. Mais si vous mettez votre chaîne avec, disons
|
en place de\n
et_
en place dealors vous avez vraiment un portable représentation, vous pouvez passer à des fonctions, etc.
Voici un exemple:
Résultat:
Pour "décompresser" votre écrasé de chaîne il suffit de passer par le même
tr
, mais avec l'ordre inversé.c'est à dire
Résultat
En plus des stratégies ci-dessus (à l'aide d'appen --
/a
et délimitant avec\\\n
) vous pouvez également le faire:Dans un sens, je préfère Glenn Jackman est la solution la plus conforme à l'intention.
Mais je trouve cette stratégie utile que vous pouvez également l'utiliser pour le passage de variables dans bashscripts. Si vous n'allez pas utiliser une variable plus d'une fois, c'est plus propre à faire que de
-v
, par exemple(Remarque: les guillemets simples travaillent également pour le
\n
, mais pas pour le passage à vars, car elle nécessite une interprétation.)OriginalL'auteur Jason R. Mick