【问题标题】:Linux command line: split a stringLinux命令行:拆分字符串
【发布时间】:2010-11-23 18:51:40
【问题描述】:

我有以下列表的长文件:

/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 提示符中编写一个 1-liner 来解决问题吗?

谢谢,

乌迪

【问题讨论】:

    标签: string bash split


    【解决方案1】:
    cat "func_list" | sed "s#//.*##" > "file_list"
    

    没有运行它:)

    【讨论】:

    • 顺便说一句 +1 勇敢地发布它而不测试它!
    • @Dennis 是的,我知道。我总是忘记备份语法,而且我通常会尝试提供非破坏性命令,尤其是如果我不事先运行它们:)
    【解决方案2】:

    你可以使用纯 Bash:

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

    编辑:

    echo 命令的语法与尤金回答中的sed 命令执行相同的操作:删除“//”以及之后的所有内容。

    分解:

    “echo ${line}”与“echo $line”相同
    "%" 如果它与参数的尾随部分匹配,则删除它后面的模式
    "%" 匹配最短,"%%" 匹配最长
    “//*”是要匹配的模式,“*”类似于sed的“.*

    有关详细信息,请参阅 Bash man 页面的参数扩展部分,包括:

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

    【讨论】:

    • 您能否解释一下“echo”中的语法,以供后代阅读您的答案?
    【解决方案3】:

    这是 (g)awk 中的单行代码

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

    【讨论】:

    • awk 和 sed 的主要区别是什么?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-17
    • 1970-01-01
    • 1970-01-01
    • 2011-12-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多