在bash的第一个管道之间提取东西?

时间:2013-08-16 00:06:16

标签: regex bash

我想在前两个管道之间提取内容:

| a650f360-a29d-4562-b46f-024fe15aa7dc | emi-ubuntu-12.04.2-server-amd64-08152013           | ACTIVE |

输出应为:

 a650f360-a29d-4562-b46f-024fe15aa7dc 

我有一个正则表达式,我将使用sed:^\|\s*(.*?)\s*\|

但根据正则表达式计算器,它也可以获得管道。我怎么摆脱它?

3 个答案:

答案 0 :(得分:5)

剪切可能比正则表达式更容易理解。为什么不

cut -d\| -f2

答案 1 :(得分:1)

sed 's/^[^|]*|\([^|]*\)|.*/\1/'

匹配开头的任何非管道(示例数据中没有任何内容),管道,捕获不是管道的东西,匹配另一个管道和最后的任何东西,并用捕获的东西替换它。

答案 2 :(得分:0)

仅限Bash。在循环中,这可以使用数组来完成:

while IFS='|'; read -a line ; do
  echo ${line[1]}            # with leading/trailing blanks
  echo ${line[1]// /}        # without leading/trailing blanks
done < "$infile"