Comment puis-je supprimer du texte avant un délimiteur sous Linux


16

J'ai besoin de supprimer le texte d'une ligne avant le délimiteur.

Par exemple:

(123434): hello::{apple,orange,mango}.

Je dois supprimer le texte avant le premier :. ie (123434).

Existe-t-il une commande sous Linux pour effectuer cette tâche?


Vous voudrez peut-être examiner sedouawk
Paul

Ce texte fait-il partie d'un fichier ou d'une variable bash?
Bernhard

Cela fait partie du dossier.
user80538

Réponses:


14

Cette sedcommande devrait faire l'affaire. La commande suivante écrasera le fichier:

sed -i 's/^[^:]*:/:/' file

Pour simplement imprimer la sortie, supprimez le -idrapeau. Pour placer la sortie dans un nouveau fichier, supprimez l' -iindicateur et redirigez la sortie:

sed 's/^[^:]*:/:/' file > new_file

La ligne a fait la magie ... la sortie remplacée dans le fichier lui-même ..
user80538

lorsque je compare deux fichiers à l'aide de sdiff, après avoir supprimé le texte des deux fichiers, la différence me montre le texte supprimé pour moi. cette commande écrase le fichier ou affiche simplement la sortie.
user80538

Cela a fonctionné. Puis-je extraire «bonjour» et {pomme, orange, mangue} de mon exemple en faisant de simples changements dans la commande ci-dessus?
user80538

@ user80538, Il est difficile de dire ce que vous voulez quand vous dites extraire dans ce contexte. Cela fait-il partie d'un script shell plus grand? Vous voudrez peut-être poser une nouvelle question avec les détails du problème plus vaste que vous essayez de résoudre.
drs

Il s'agit simplement d'une simple comparaison de deux fichiers avec les mêmes données, mais il suffit de trouver où les données diffèrent dans deux fichiers. Je dois vérifier chaque section individuelle de la ligne. Les données dans des sections individuelles peuvent se confondre. comme {pomme, orange, mangue} peut être {pomme, mangue, orange}.
user80538

14

Vous pouvez utiliser cut:

echo '(123434): hello::{apple,orange,mango}.' | cut -d: -f2-

5

Vous pouvez le faire avec une instruction Bash assez simple :

mytext="(123434): hello::{apple,orange,mango}."

echo ${mytext#*)}

Cela s'imprimera : hello::{apple,orange,mango}.. Vous pouvez couper les préfixes et suffixes de la même manière. De plus, les définitions de préfixe et de suffixe peuvent contenir des caractères génériques.

Couper le préfixe - jusqu'à la première correspondance générique du préfixe: ${variable#prefix}

Couper le préfixe - jusqu'à la dernière correspondance générique du préfixe: ${variable##prefix}

Couper le suffixe - jusqu'à la première correspondance générique du suffixe: ${variable%suffix}

Couper le suffixe - jusqu'à la dernière correspondance générique du suffixe: ${variable%%suffix}

Cela peut sembler peu clair à première vue, voir l'exemple suivant:

mytext="xAxBxAxBx"
echo ${mytext#*A}    # will print: xBxAxBx
echo ${mytext##*A}   # will print: xBx
echo ${mytext%B*}    # will print: xAxBxAx
echo ${mytext%%B*}   # will print: xAx
echo ${mytext%%C*}   # will print: xAxBxAxBx

Dans le dernier exemple, le motif ne correspond pas, donc rien n'est coupé.


Ce serait plus robuste à utiliser echo ${mytext#*:}:. Cela gérera correctement les lignes comme (123)(434): hello::{apple,orange,mango}.et 123434: hello::{apple,orange,mango}.
drs

existe-t-il un moyen de modifier la commande echo $ {mytext %% B *} pour obtenir du texte après B. dans votre exemple
user80538

@ user80538 oui, il suffit de couper le texte avant B, inclus ;-), c'est-à-dire: $ {mytext # * B} pour le texte après le premier B, et $ {mytext ## * B} pour le texte après le second B.
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.