删除#开头的字符串和#之后的所有内容

时间:2016-03-18 02:57:04

标签: 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

3 个答案:

答案 0 :(得分:3)

  • 使用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
    

答案 1 :(得分:1)

补充Benjamin W.'s helpful answer

grep是另一种选择:

  • 如果您不想加入#

    grep -Eo '^[^#]+' file
    
  • 如果您想要加入#

    grep -Eo '^[^#]+.' file
    

答案 2 :(得分:0)

Using Python Regex (.*?)(#.*)并替换为\1