我正在写一个脚本,接受字符串作为参数。我想运行一个特定的命令,检查该命令的输出,以获取输入字符串,首先返回匹配<input string>$
的行,并且只有在没有返回任何行的情况下,然后返回所有包含<input string>
的行。我目前正在使用grep -E
,但我对awk或sed
开放。
考虑将此输出写入文件:
> cat command.out
A
A1
B
B1
B2
C1
C2
C3
XYZ
XYZ1
XYZ2
如果我的输入字符串是'B',那么我想返回
B
不
B
B1
B2
如果我的输入字符串是'C',那么我想返回
C1
C2
C3
如果我的输入字符串是'Z',那么我想返回
XYZ
如果我的输入字符串是'Y',那么我想返回
XYZ
XYZ1
XYZ2
使用|模式中的(or)不做我想要的,因为它会返回所有带有B的行。
我所拥有的工作,但似乎效率低下,我怀疑有更好的方法。
> command_output="$(cat command.out)"
> matches="$( (print "$command_output"|grep -E 'B$')||(print "$command_output"|grep -E 'B') )"
> print "$matches"
B
> matches="$( (print "$command_output"|grep -E 'C$')||(print "$command_output"|grep -E 'C') )"
> print "$matches"
C1
C2
C3
我必须持久化命令输出,并可能触发两个grep。我本希望能有一个管道式的俏皮话
matches="$(<run command>|grep <first pattern, if no match, second pattern>)"
但也许这是不可能的。
3条答案
按热度按时间chhkpiq41#
$
连接到r
的值以形成锚定到行尾的正则表达式。如果$0
匹配:exact
exact
尚未设置,且$0
在任何地方匹配r
:inexact
exact
未设置(即未找到完全匹配项),打印所有存储行请注意,传入的值用作正则表达式。这对应于问题中的
grep
用法。要匹配精确的字符串,而不是正则表达式,请记住转义任何正则表达式元字符。另一种方法是使用精确的字符串比较而不是正则表达式(并且累加成字符串而不是数组):
我们知道字符串和输入行的长度。当字符串出现在行中时,字符串的位置+长度只有出现在末尾时才会比行长:
hts6caw32#
在shell中使用
||
操作符运行grep
两次,首先匹配作为整行的输入,然后作为前缀。ecr0jaav3#
如果我没有理解你的问题,你希望匹配被分组在一起,这样组中的第一行总是单独的字符串或带有后缀的字符串,并且在文件中不会有其他匹配项。在这些情况下,如果前缀匹配,如果没有完全匹配,只需回退到打印。