我的输出如下:
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
打印匹配