4 votes

Insertion d'une chaîne de caractères de xargs dans une autre chaîne de caractères

Disons que j'ai une commande qui sort un tas de chaînes de caractères. La sortie de cette commande pourrait ressembler à quelque chose comme :

...
foo
bar
blargh
...

Disons que j'ai un ensemble de chaînes

myString$Blah

Je veux insérer chacune des chaînes de caractères où se trouve le $ dans la sortie de la commande de façon à obtenir un fichier qui ressemble à ceci :

...
myStringfooBlah
myStringbarBlah
myStringblarghBlah
...

Quel est le moyen le plus simple d'y parvenir ? (Awk et sed de préférence)

11voto

Dan D. Points 5666

Vous n'avez même pas besoin sed o awk .

xargs peut le faire : avec : -L1 -I '$' echo 'myString$Blah'

$ cat x.list
foo
bar
blargh
$ cat x.list | tr '\n' '\0' | xargs -0 -L1 -I '$' echo 'myString$Blah'
myStringfooBlah
myStringbarBlah
myStringblarghBlah

1voto

jakesandlund Points 171

En supposant que vous pouvez utiliser la chaîne de format myString&Blah avec une esperluette à la place du signe dollar, mettez votre sortie dans ceci :

sed "s/.*/$format/"

Cela fonctionne parce que le & est utilisé comme un opérateur "insérer la correspondance ici" dans la chaîne de remplacement. L'expression rationnelle correspond à la ligne entière, de sorte que la ligne entière sera insérée à l'endroit où se trouve la chaîne de remplacement. & .

Il est important d'utiliser les guillemets doubles pour permettre l'expansion de la chaîne de format.

Si vous avez vraiment besoin d'utiliser l'esperluette, utilisez ceci :

sed "s/.*/$(echo "$format" | tr '$' '&')/"

Les guillemets autour de $format sont importants si vous avez des espaces dans la chaîne.

1voto

jjlin Points 14572

Vous pouvez le faire entièrement dans le Shell ( bash du moins) sans trop de problèmes. Voici un script qui fait cela :

#!/bin/bash

pattern="$1"
input_file="$2"
output_file="$3"

saved_IFS="$IFS"
IFS=$'\n'
# Store each line of the input file into an array named 'lines'.
lines=($(< $input_file))
IFS="$saved_IFS"

# Truncate output file, if any.
cat /dev/null > $output_file

# Substitute each line into the pattern, and write to output file.
for ln in "${lines[@]}"
do
  echo ${pattern/$/$ln} >> $output_file
done

Supposons que ce script soit appelé script et vous avez un fichier appelé in.txt avec une chaîne par ligne, puis en exécutant script in.txt out.txt vous donnerait le résultat souhaité en out.txt .

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X