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?

user80538
la source
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
drs
la source
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-
Joseph R.
la source
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é.


la source
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.