linux - 删除以 # 开头的字符串以及 # 之后的所有内容

标签 linux awk sed

如何删除以 # 开头的子字符串以及 # 之后的所有内容?

有很多在不同的线路上;它们都以#开头,都在行尾,而且行尾的数字总是不同的。它们都是 15 个字符长;我想使用 sed 或 awk 删除从 # 到行尾的所有内容。

http://www.somesite/play/episodes/xyz/fred-episode-110#group=p02q32xl
http://www.somesite/play/episodes/abc/simon-episode-266#group=p03d924k
http://www.somesite/play/episodes/qwe/mum-episode-39#group=p03l1jpr
http://www.somesite/play/episodes/zxc/dad-episode-41#group=p03l1j9s
http://www.somesite/play/episodes/asd/bob-episode-57#group=p03l1j7g

最佳答案

  • 使用cut – 将#声明为字段分隔符并只打印第一个字段:

    cut -d '#' -f 1 infile
    
  • 使用 sed – 将 # 开始的所有内容替换为空字符串:

    sed 's/#.*//' infile
    
  • 使用 awk – 将 # 声明为字段分隔符并打印第一个字段:

    awk -F'#' '{ print $1 }' infile
    
  • 使用 Bash,利用它始终是最后 15 个字符这一事实:

    while IFS= read -r line; do
        echo "${line:0:-15}"
    done < infile
    

    请注意,这 a) 非常慢并且 b) 需要 Bash 4.2-alpha 或更新版本来支持参数扩展中的负长度值。

  • 使用 Perl – 按 # 拆分,获取列表的第一个字段并使用 say 打印它以包含换行符:

    perl -nE 'say ((split /#/)[0])' infile
    

    或者,更简洁和 sed-ish(指出我的 mklement0 ):

    perl -pe 's/#.*//' infile
    

关于linux - 删除以 # 开头的字符串以及 # 之后的所有内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36075344/

相关文章:

linux - 来自内核模块的调试堆栈

linux - 如何在 linux 的标准共享库(C)中添加自己的自定义函数?

linux - 重新格式化输出打印

linux - 连接文件 awk/linux

regex - 使用扩展正则表达式和捕获组的 sed

linux - 如何从PID查找网络连接

regex - 如何从差异中排除除特定文件外的所有文件

sed - 从一行中提取特定单词

regex - 进行各种替换,但只能在字符之前

linux - AWK 查找两个模式并打印以作为命令执行