我正在尝试grep或awk一些非常简单的操作,无法执行。
#!/bin/sh
textfile="1_abc 2_def 3_xyz"
echo "$textfile"
new=$(echo "$textfile" | grep -o "xyz" )
echo "$new"
$ new是xyz
,我想要的输出是3_xyz
。
我已经尝试过grep
的不同切换,但是没有运气。
答案 0 :(得分:2)
Grep不在乎单词,它只是匹配字符,因此在您的示例中,不匹配了“ 3_xyz”,而匹配了“ xyz”。无法知道您是否考虑了比赛的“ 3_”部分,但也没有考虑比赛之前的“ def”。
为了输出所需的整个字符串,您需要一个与整个字符串匹配的grep模式。看起来到底取决于实际输入的样子,但是对于给出的示例,它可能是[0-9]_xyz
或..xyz
,或者也许是[^ ]+xyz
。
答案 1 :(得分:2)
$ echo "$textfile" | grep -o '[^[:space:]]*xyz[^[:space:]]*'
3_xyz
或对于多字符RS和\s
速记使用GNU awk:
$ echo "$textfile" | awk -v RS='\\s' '/xyz/'
3_xyz
或者如果您真的确定$textfile
包含什么并且不能有任何通配符等(或设置noglob
):
$ printf '%s\n' $textfile | grep 'xyz'
3_xyz
答案 2 :(得分:2)
缓慢而简单:
textfile="1_abc 2_def 3_xyz"
echo "$textfile" | tr ' ' '\n' | grep xyz
用空格替换换行符,然后用grap替换插入的字符串。