Linux命令行:分割字符串

3

我有一个长文件,其中包含以下列表:

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

它包含内核代码中的所有功能。表示法为文件//函数

我想从内核目录复制一些100个文件到另一个目录,所以我想剥离每行的函数名,只留下文件名。

在Python中非常容易,您有没有想过如何在bash提示符中编写1行代码来完成这项任务?

谢谢,

Udi

4个回答

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

没有运行它 :)


顺便说一句,对于毫不犹豫地发布未经测试的代码,给你点赞! - Adam Matan
1
@Dennis,是的,我知道。我总是忘记备份语法,而且通常会尝试使用非破坏性命令,尤其是如果我没有在运行它们之前 :) - Eugene

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}检索子字符串
  • 等等。

1
请问您能否解释一下“echo”中的语法,以便未来的读者阅读您的答案时能够理解? - Adam Matan

4
这是一行(g)awk代码:
awk -F"//" '{print $1}' file

awk和sed之间的主要区别是什么? - Adam Matan

0

这里有一个使用 cut 和 rev 的例子

cat file | rev | cut -d'/' -f2-| rev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接