184 votes

Comment utiliser sed/grep pour extraire le texte entre deux mots ?

J'essaie de produire une chaîne qui contient tout ce qui se trouve entre deux mots d'une chaîne :

l'entrée :

"Here is a String"

sortie :

"is a"

Utilisation :

sed -n '/Here/,/String/p'

inclut les points de terminaison, mais je ne veux pas les inclure.

217voto

anishsane Points 5987

GNU grep peut également prendre en charge le look-ahead et le look-back positif et négatif : Dans votre cas, la commande serait :

echo "Here is a string" | grep -o -P '(?<=Here).*(?=string)'

S'il y a plusieurs occurrences de Here y string vous pouvez choisir si vous voulez correspondre à partir de la première. Here et enfin string ou les faire correspondre individuellement. En termes de regex, on parle de correspondance gourmande (premier cas) ou correspondance non avide (deuxième cas)

$ echo 'Here is a string, and Here is another string.' | grep -oP '(?<=Here).*(?=string)' # Greedy match
 is a string, and Here is another 
$ echo 'Here is a string, and Here is another string.' | grep -oP '(?<=Here).*?(?=string)' # Non-greedy match (Notice the '?' after '*' in .*)
 is a 
 is another

141voto

Brian Campbell Points 101107
sed -e 's/Here\(.*\)String/\1/'

91voto

wheeler Points 757

La réponse acceptée ne supprime pas le texte qui pourrait être avant Here ou après String . Ce sera :

sed -e 's/.*Here\(.*\)String.*/\1/'

La principale différence est l'ajout de .* immédiatement avant Here et après String .

47voto

ghoti Points 14996

Vous pouvez dépouiller les chaînes de caractères dans Bash seul :

$ foo="Here is a String"
$ foo=${foo##*Here }
$ echo "$foo"
is a String
$ foo=${foo%% String*}
$ echo "$foo"
is a
$

Et si vous avez un GNU grep qui inclut PCRE vous pouvez utiliser une assertion de largeur nulle :

$ echo "Here is a String" | grep -Po '(?<=(Here )).*(?= String)'
is a

28voto

alemol Points 81

Si vous avez un long fichier avec de nombreuses occurrences sur plusieurs lignes, il est utile d'imprimer d'abord les lignes de numéros :

cat -n file | sed -n '/Here/,/String/p'

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X