Linux命令行:拆分字符串

时间:2009-08-28 15:42:03

标签: string bash split

我的文件很长,包含以下列表:

/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()
....

它包含内核代码中的所有函数。符号为file//function

我想将大约100个文件从内核目录复制到另一个目录,所以我想从函数名中删除每一行,只留下文件名。

在python中这是非常简单的,任何想法如何在bash提示符中写一个单行代码来实现这个技巧?

谢谢,

乌迪

3 个答案:

答案 0 :(得分:9)

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

没有运行它:)

答案 1 :(得分:6)

您可以使用纯Bash:

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

修改:

echo命令的语法与Eugene的答案中的sed命令做同样的事情:删除“//”以及之后的所有内容。

细分:

  

“echo $ {line}”与“echo $ line”相同   如果“%”匹配参数
的尾部,则“%”将删除其后面的模式   “%”使得最短的匹配,“%%”使得最长的匹配   “// *”是要匹配的模式,“*”类似于sed的“。*

有关详情,请参阅Bash man页面的参数扩展部分,其中包括:

  • 使用${parameter#word}匹配参数的开头
  • ${parameter/pattern/string}sed - 样式替换
  • ${parameter:offset:length}检索子字符串

答案 2 :(得分:4)

这是(g)awk中的一个班轮

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