如果发现两种模式,则将其转换为从开始到结束的单行模式。举例-
cat test.txt qwe rty uio {asd fgh jkl zxc} vbn mqw rty
现在所需o/p应为
qwe rty uio {asd fgh jkl zxc} vbn mqw rty
谢谢
uplii1fm1#
解决方案TXR。
$ txr data.txr data qwe rty uio {asd fgh jkl zxc} vbn mqw rty
data是:
data
data.txr是:
data.txr
@(repeat) @ (cases) @pre{@post @(freeform " ") @rest} @; <-- space after @rest} here. @ (do (put-line `@pre{@post @rest}`)) @ (or) @nomatch @ (do (put-line nomatch)) @ (end) @(end)
@pre@{post意味着匹配包含{字符的行。{字符之前的所有内容都进入pre变量;之后的所有内容都转到post。然后freeform " "意味着为了后续匹配的目的,输入行被认为是一个单行,其中它们通过空格连接。在这一行中,我们匹配@rest}:前缀部分进入变量rest直到一个右大括号,我们还匹配大括号和后面的空格。如果所有这些材料都匹配,我们将其输出为一行。如果不存在上述匹配,则第二种情况匹配一行,将其捕获到nomatch中,并按原样输出。然后周围的repeat向下行进经过匹配的线以再次尝试匹配。
@pre@{post
{
pre
post
freeform " "
@rest}
rest
nomatch
repeat
nxowjjhe2#
这可能对你有用(GNU sed):
sed '/{/{:a;N;/}/!ba;s/\n\+/ /g;s/}\s*/&\n/}' file
收集从{开始到}结束的行。用空格替换每个换行符(或多个换行符)。在}后面插入一个换行符,并删除任何可能的白色。
}
2条答案
按热度按时间uplii1fm1#
解决方案TXR。
data
是:data.txr
是:@pre@{post
意味着匹配包含{
字符的行。{
字符之前的所有内容都进入pre
变量;之后的所有内容都转到post
。然后
freeform " "
意味着为了后续匹配的目的,输入行被认为是一个单行,其中它们通过空格连接。在这一行中,我们匹配@rest}
:前缀部分进入变量rest
直到一个右大括号,我们还匹配大括号和后面的空格。如果所有这些材料都匹配,我们将其输出为一行。如果不存在上述匹配,则第二种情况匹配一行,将其捕获到
nomatch
中,并按原样输出。然后周围的
repeat
向下行进经过匹配的线以再次尝试匹配。nxowjjhe2#
这可能对你有用(GNU sed):
收集从
{
开始到}
结束的行。用空格替换每个换行符(或多个换行符)。
在
}
后面插入一个换行符,并删除任何可能的白色。