Print text between delimiters using sed
假设我有op(abc)asdfasdf,并且我需要sed在括号之间打印abc。什么对我有用? (注意:我只希望一行的第一对定界符之间的文本,如果输入的特定行没有一对括号,则什么也不要。)
- 重复的stackoverflow.com/questions/23875129/…具有许多非sed解决方案。
1 2
| $ echo 'op(abc)asdfasdf' | sed 's|[^(]*(\\([^)]*\\)).*|\\1|'
abc |
- 它的功能很棒,请您解释一下语法的含义,以便我可以尝试解决类似的问题?
-
@mark参见@ jonathan-leffler的回答,上面他完整地描述了它的工作原理。一个区别是我不使用-n选项(但是可能应该这样做,因为当字符串不匹配时,我的一线将打印原始字符串)。
-
@Mark:解释与我的回答基本相同;该解决方案与我的解决方案基本相同。一个区别是php-coder使用\\'| \\',而我使用\\'/ \\'。否则,他的解决方案将打印不包含一对配对括号的行,而我的解决方案将删除不匹配的括号对的行-对您的问题的解释有所不同。在样本输入上,两种解决方案都产生相同的输出。
1
| sed -n -e '/^[^(]*(\\([^)]*\\)).*/s//\\1/p' |
该模式查找以零个或多个字符列表开头的行,这些字符不是开括号,然后是开括号。然后开始记住一个列表,该列表包含零个或多个非圆括号的字符,然后是一个圆括号,然后是其他内容。用您记住的列表替换输入并打印。 -n表示\\'默认情况下不打印\\'-不带括号的任何输入行都不会打印。