【问题标题】:Deleting the data before character match在字符匹配之前删除数据
【发布时间】:2014-11-18 23:55:12
【问题描述】:

如何使用 Perl 或 sed 删除字符串中“/”之前的字符,包括“/”?

例如,这个:

ad9a91/FFFF0000

会变成

FFFF0000

【问题讨论】:

    标签: regex perl sed


    【解决方案1】:
    my $string = qq(sjdflksdjfsdj ad9a91/FFFF0000 slodjfsdf s);
    $string =~ s{\b(\s).*?\b/}{$1}ig;
    print $string;exit;
    

    您也可以尝试使用任何空格或任何标签进行拆分。

    【讨论】:

      【解决方案2】:

      Sed 解决方案

      sed 's|[^/]*/||' file
      

      将删除直到并包括第一个 / 的所有内容

      sed 's|.*/||' file
      

      将删除直到并包括最后一个 / 的所有内容。

      我添加了两者,因为问题并不完全清楚每次字符串的格式是什么。

      Awk

      awk -F/ '{$0=$NF}1' file
      

      这会将整行替换为最后一个 / 之后的任何内容

      【讨论】:

      • 你应该解释第一个和第二个版本的区别(第二个版本替换所有直到最后一个斜线,如果一行中出现多个斜线)
      • 它基于您的示例(其中没有比您显示的更多的单词或字符)。第一个“删除”第一个字符直到第一个 / 和第二个就像你写“删除”直到最后一个。在这种情况下,效果相同,如果有环绕词/字符则不是,但在这种情况下两者都是错误的(但也脱离上下文)。
      • @CasimiretHippolyte 添加了解释:)
      • 谢谢,你能告诉我一个删除文件最后3行的sed命令吗
      • @user3383729 发布新问题或使用搜索功能,您会找到答案。快速搜索发现stackoverflow.com/questions/13380607/…
      【解决方案3】:

      你可以使用替换,

      my $str = "ad9a91/FFFF0000";
      $str =~ s|^.+?/||;
      

      或正则表达式捕获,

      $str = $1 if $str =~ m|/(.+)|s;
      

      【讨论】:

        【解决方案4】:

        为此使用替换:

        my $string = "ad9a91/FFFF0000";
        $string =~ s|\.+/||;
        

        【讨论】:

        • 但它不是一行,在“/”字符后有多行随机数据
        • @user3383729 对不起我的错。更新了我的答案
        猜你喜欢
        • 2023-04-04
        • 1970-01-01
        • 1970-01-01
        • 2022-12-12
        • 2016-04-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-12-25
        相关资源
        最近更新 更多