使用分号之间用空格分隔的数据

使用分号之间用空格分隔的数据

我的输出如下:

scott name1;tiger name2;elephant name3;mouse name4;bla1 name5;bla2 name6

我想搜索“scott”并且只得到字符串“name1”。我怎样才能用 sed 实现这个目标?

答案1

更详细的解决方案:

echo "scott name1;tiger name2;elephant name3;mouse name4;bla1 name5;bla2 name6" \
  | tr ';' '\n' | grep "scott" | cut -d ' ' -f 2

答案2

使用 awk:

echo "scott name1;tiger name2;elephant name3;mouse name4;bla1 name5;bla2 name6" \
  | awk -v RS=\; '$1=="scott"{print $2}'

记录分隔符RS设置为;能够捕获字符串作为记录的scott第一个字段。$1找到后,$2将打印第二个字段。

答案3

尝试这个,

echo "scott name1;tiger name2;elephant name3;mouse name4;bla1 name5;bla2 name6" \
  | sed -n -e 's/^scott \(\w\+\);.*/\1/p'

只需反向引用“scott”和“;”之间的字符串即可。

答案4

sed

$ echo "scott name1;tiger name2;elephant name3;mouse name4;bla1 name5;bla2 name6" \
  | sed -n 's/\(^\|.*;\)scott \([^;]*\).*/\2/p'
name1

或者用“老虎”:

$ echo "scott name1;tiger name2;elephant name3;mouse name4;bla1 name5;bla2 name6" \
  | sed -n 's/\(^\|.*;\)tiger \([^;]*\).*/\2/p'
name2
  • sed -n禁用图案空间的自动打印
  • s/代替
  • \(^\|.*;\)匹配行的开头^或分号后的任何字符.*;作为第一个捕获组与\(...\)
  • scott匹配“scott”后跟一个空格字符
  • \([^;]*\)第二个捕获组,匹配任何非分号字符(我们想要的部分)
  • .*匹配任何以下字符
  • /\2/替换为第二个捕获组
  • p打印匹配

相关内容