在下面的示例中,如何返回第n个pattern1和第m个pattern2之间的字符串,其中pattern1和pattern2在字符串中可能多次出现?
更好的例子:
zz this is string xx zz another string xx third string zz xx and a tail xx
您将如何在第二个zz和第三个xx之间返回?
即
another string xx third string zz
编辑:对于那些寻找这一点,正则表达式“捕获组”和“前进/后退参照”似乎是需要什么这个任务。该术语在这里有用的信息。
对不起初始助手。您的回答很好,我的榜样选择不当。
随意从此处删除,以整理此问题。为了完整起见,我将其保留为原始答案。
可怜的原始问题和例子:
echo '1a 2b 3c 4d 5e 6f 7g 8h 9i 0j'
如果可以同时提出两个解决方案而又不留空格的话,将为您加分。我知道可以通过重新布置sed来删除前导/后部空格,但是我很好奇是否有更整洁的解决方案。我期望的输出(不包括单引号)是:
'3c 4d 5e 6f'
要么 ' 3c 4d 5e 6f '
我尝试了几种变体。我相信这是用sed校正的最近的方法:
echo '1 2 3 4 5 6 7 8 9 0' | sed -n 's/.*[ ]{2}.*[ ]{4}.*/\1/p'
但是,它返回错误:
sed -e expression #1, char 28: invalid reference \1 on `s' command's RHS
使用普通的GNU sed
:
pat1='zz'
n=2
pat2='xx'
m=3
echo 'zz this is string xx zz another string xx third string zz xx and a tail xx' |
sed "s/$pat1/\n/$n; s/$pat2/\n/$m; s/[^\n]*\n//; s/\n.*//"
产出
another string xx third string zz
s/$pat1/\n/$n
用换行符替换$n
th $pat1
。
s/$pat2/\n/$m
用换行符替换$m
th $pat2
。
s/[^\n]*\n//
删除字符串开头和第一个换行符(包括)之间的部分。
s/\n.*//
删除换行符(包括)和字符串末尾之间的部分。
注意:sed
命令可以稍微简化为sed -E "s/$pat1/\n/$n; s/$pat2/\n/$m; s/.*\n(.*)\n.*/\1/"
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句