如何使用sed抓取正则表达式

时间:2015-09-18 01:21:46

标签: regex bash sed osx-yosemite

我想像这样抓住字符串中的数字:

 "sample_2341-43-11.txt"   to   2341-43-11

所以我尝试了以下命令:

echo "sample_2341-43-11.txt" | sed -n -r 's|[0-9]{4}\-[0-9]{2}\-[0-9]{2}|\1|p'

我看到了这个答案,这就是我的想法。 Use sed to grab a string,但它在我的机器上不起作用:

  • 它出错“非法选项-r”。
  • 它也不喜欢\1

我在MacOSX优胜美地上使用sed。

这是从文件名中提取信息的最简单方法吗?

5 个答案:

答案 0 :(得分:2)

您需要设置分组并匹配其余部分以将其与组一起删除。此外 - 不需要转义。并且-n将禁止输出(它只返回脚本条件的退出级别)。

echo "sample_2341-43-11.txt" | sed -r 's/^.*([0-9]{4}-[0-9]{2}-[0-9]{2}).*$/\1/'

答案 1 :(得分:2)

在sed。的Mac版本中,增强的正则表达式为not supported

您可以改为使用int nTimeIdxNum = -1; try { nTimeIdxNum = k.indexOf("x22T:"); }catch(Exception e) { System.out.println(e.getMessage()); } if (nTimeIdxNum > -1) { String local_date = ""; System.out.println("k.length() = " + k.length()); System.out.println("nTimeIdxNum = " + String.valueOf(nTimeIdxNum)); try { local_date = k.substring(nTimeIdxNum, 13); }catch(Exception e) { System.out.println(e.getMessage()); }

return null

<强>输出

protected JSONObject doInBackground(String... args) {

    // declare it here
    JSONObject json = null;
    GCMRegistrar.checkDevice(context);
    GCMRegistrar.checkManifest(context);
    final String regId = GCMRegistrar.getRegistrationId(context);
    if (regId.equals("")) {        
        GCMRegistrar.register(context,SENDER_ID);
    }else {
        if (GCMRegistrar.isRegisteredOnServer(context)) {               
            Toast.makeText(getApplicationContext(), "Already registered with GCM", Toast.LENGTH_LONG).show();
        } else {
            UserFunctions userFunction = new UserFunctions();
            json =userFunction.registerUser(context,fname, lname, email, password,regId);
        }
    }

    // if the criteria isn't met then return the null object reference
    return json;
}

答案 2 :(得分:0)

echo "one1sample_2341-43-11.txt" \
 | sed 's/[^[:digit:]-]\{1,\}/ /g;s/ \{1,\}/ /g;s/^ //;s/ $//'

1 2341-43-11
  • 提取使用-完成的所有数字(数字)(因此允许--12但可以轻松处理)
  • posix compliance
  • 该行的所有数字都在同一行(如果有)以空格字符分隔(如果需要可以更改为新行)

答案 3 :(得分:0)

您也可以尝试这种方式

sed 's/[^_]\+_\([^.]\+\).*/\1/' <<< sample_2341-43-11.txt

<强>输出:

2341-43-11

<强>解释

[^_]\+       - Match the content untile _ ( sample_)
\([^.]\+\)   - Match the content until . and capture the pattern (2341-43-11)
.*           - Discard remaining character (.txt)

答案 4 :(得分:-1)

你可以看看上面的海报说的话。好吧,利用这个

模式“\ d + - \ d + - \ d +”将匹配您要查找的内容。见这里的演示

https://regex101.com/r/kO2cZ1/3