2009-08-28 10 views
3

je longue file avec la liste suivante:Linux ligne de commande: diviser une chaîne

/drivers/isdn/hardware/eicon/message.c//add_b1() 
/drivers/media/video/saa7134/saa7134-dvb.c//dvb_init() 
/sound/pci/ac97/ac97_codec.c//snd_ac97_mixer_build() 
/drivers/s390/char/tape_34xx.c//tape_34xx_unit_check() 
(PROBLEM)/drivers/video/sis/init301.c//SiS_GetCRT2Data301() 
/drivers/scsi/sg.c//sg_ioctl() 
/fs/ntfs/file.c//ntfs_prepare_pages_for_non_resident_write() 
/drivers/net/tg3.c//tg3_reset_hw() 
/arch/cris/arch-v32/drivers/cryptocop.c//cryptocop_setup_dma_list() 
/drivers/media/video/pvrusb2/pvrusb2-v4l2.c//pvr2_v4l2_do_ioctl() 
/drivers/video/aty/atyfb_base.c//aty_init() 
/block/compat_ioctl.c//compat_blkdev_driver_ioctl() 
.... 

Il contient toutes les fonctions du code du noyau. La notation est file//function. Je veux copier quelque 100 fichiers du répertoire du noyau vers un autre répertoire, donc je veux enlever chaque ligne du nom de la fonction, en ne laissant que le nom du fichier.

C'est super facile en python, aucune idée de comment écrire un 1-liner dans l'invite bash qui fait l'affaire?

Merci,

Udi

+3

./my_python_script.py – aehlke

+1

+1 Nous aimons tous python. –

Répondre

9
cat "func_list" | sed "s#//.*##" > "file_list" 

n'a pas couru :) il

+0

BTW +1 pour le courage de le publier sans le tester! –

+0

Fonctionne, merci beaucoup. –

+1

L'utilisation inutile de 'cat',' sed' accepte un nom de fichier d'entrée. –

6

Vous pouvez utiliser Bash pur:

while read -r line; do echo "${line%//*}"; done < funclist.txt 

Edit:

La syntaxe de la commande echo fait la même chose que la commande sed dans la réponse d'Eugene: supprimer le "//" et tout ce qui vient après.

dégradables:

« echo $ {ligne} » est le même que « echo $ ligne »
le « % » supprime le modèle qui suit si elle correspond à la partie arrière du paramètre
"%" rend le plus court correspondance possible, "%%" rend la plus longue possible
"// *" est le modèle pour correspondre, "*" est similaire à sed « s " *"

Voir la section d'extension des paramètres de la page Bash man pour plus d'informations, y compris:

  • utilisant ${parameter#word} pour faire correspondre le début d'un paramètre
  • ${parameter/pattern/string} faire sed remplacements -style
  • ${parameter:offset:length} pour récupérer les sous-chaînes
  • etc.
+1

Pouvez-vous s'il vous plaît expliquer la syntaxe dans rhe "echo", pour les générations futures lisant votre réponse? –

4

est ici une doublure en (g) awk

awk -F"//" '{print $1}' file 
+0

Quelle est la principale différence entre awk et sed? –

Questions connexes