【问题标题】:sed retrieve part of linesed 检索部分行
【发布时间】:2020-11-03 11:14:32
【问题描述】:

我的代码行如下所示:

hi:12345:234(第二行)

如何使用 sed 命令编写一行代码,只打印出第二行中的第二项?

我当前的命令如下所示:

sed -n '2p' file 得到第二行,但我不知道使用什么正则表达式来仅匹配第二项“12345”并与我当前的命令结合

【问题讨论】:

  • 你可以这样做:awk -F: '(FNR==2){print $2}' 或这个sed -n "2{s/.*:\([^:]\+\):.*/\1/;p;q}"
  • sed -n '2{s/[^:]*://; s/:.*//p; q}'

标签: regex linux sed


【解决方案1】:

您能否尝试在 GNU sed 中使用所示示例进行跟踪、编写和测试。

sed -n '2s/\([^:]*\):\([^:]*\).*/\2/p' Input_file

解释:使用sed-n 选项将停止打印所有行,并且仅对我们明确提及@ 的行进行打印987654325@ 打印选项(稍后在代码中)。然后提到2s 意味着仅在第二行执行替换。然后使用正则表达式和sed 的功能将匹配的正则表达式存储到临时缓冲区中,稍后可以通过编号1,2...and so on 检索值。正则表达式基本上是根据 OP 的要求捕获在第一次出现 : 之前的第一部分,然后是在第一次出现 : 之后的第二部分,直到第二次出现 :。因此,在进行替换时,提及/2 将根据请求将整行替换为存储在缓冲区中的第二个值,然后提及p 将仅在第二行打印该部分。

【讨论】:

    【解决方案2】:

    几个解决方案:

    echo "hi:12345:234" | sed -n '2s/.*:\([0-9]*\):.*/\1/p'
    echo "hi:12345:234" | sed -n '2{s/^[^:]*://; s/:.*//p; q}'
    echo "hi:12345:234" | awk -F':' 'FNR==2{print $2}'
    

    全部显示12345

    sed -n '2s/.*:\([0-9]*\):.*/\1/p' 仅显示捕获的值,这要归功于-np 选项/标志。它匹配两个冒号之间捕获数字的整个字符串,\1 只保留捕获。

    sed -n '2{s/^[^:]*://;s/:.*//p;q}' 删除从开始到第一个 : 的所有内容,从第二个到结束的所有内容,然后退出 (q),因此如果您的文件很大,它会被更快地处理。

    awk -F':' 'FNR==2{print $2}' 用冒号分割第二行并获取第二项。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-07
      • 1970-01-01
      • 2010-12-05
      • 1970-01-01
      • 2018-01-23
      • 2021-02-03
      • 2020-10-09
      • 1970-01-01
      相关资源
      最近更新 更多