J'ai une question sed à laquelle je n'ai pas encore trouvé de réponse:
J'ai un tas de fichiers, certains d'entre eux commencent par la chaîne ### et d'autres non. Dans chaque fichier commençant par ### , je voudrais insérer une chaîne de plusieurs lignes avant la première ligne actuelle.
f.e. Si un fichier ressemble à
my multi line string ### the first line abc cba jfkdslfjslkd
Je veux que la chaîne multi-lignes soit insérée en haut
### the first line abc cba jfkdslfjslkd
Rien d'autre dans le fichier devrait être modifié.
Si un fichier ne commence pas par ### , je ne veux pas le modifier.
3 Réponses :
Commençons par définir votre chaîne:
$ s='my\nmulti\nline\nstring\n'
$ awk -v string="$s" 'NR==1 && /^###/ {print string} 1' File
my
multi
line
string
### the first line
abc cba jfkdslfjslkd
Maintenant, exécutons une commande sed:
$ sed "1s/^###/$s&/" File my multi line string ### the first line abc cba jfkdslfjslkd
Comment ça marche:
1s / ancien / nouveau / remplace nouveau par ancien mais seulement si old apparaît sur la première ligne.
1s / ^ ### / $ s & / remplace la chaîne $ s devant ### si le la première ligne commence par ###.
Attention: La chaîne s ne doit contenir aucun caractère sed-actif. Si la chaîne s n'est pas sous votre contrôle, il s'agit d'une violation de sécurité.
Awk gère judicieusement les variables et cela évite la sécurité problème.
$ s='my\nmulti\nline\nstring\n\n'
Je crois (votre opinion est la bienvenue) ma réponse évite le problème de sécurité avec sed?
@AlexHarvey Dans votre réponse, essayez string = $ '\ n /./ w newfile' et vous vous retrouverez avec un nouveau fichier sur votre système de fichiers.
Cela peut être une solution plus simple dans sed:
Entrée:
â¶ gsed -e '1{/^###/i\' -e "$string" -e '}' FILE
my
multi
line
string
### the first line
abc cba jfkdslfjslkd
### other lines"
Solution:
â¶ string='my\nmulti\nline\nstring\n' â¶ cat FILE ### the first line abc cba jfkdslfjslkd ### other lines
Explication :
-e nous permet d'éviter d'interpoler des chaînes dans la commande sed. i \ comme indiqué dans le manuel GNU. essayé sur gnu sed et bash
$ a='my\nmulti\nline\nstring'; echo -e $a
my
multi
line
string
$ sed -Ee "0,/^###/{/^###/i$a" -e '}' file*
my
multi
line
string
### the first line
abc cba jfkdslfjslkd