linux 如果发现两个模式,然后转换成单行从开始到结束模式

c3frrgcw  于 2023-06-21  发布在  Linux
关注(0)|答案(2)|浏览(101)

如果发现两种模式,则将其转换为从开始到结束的单行模式。
举例-

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
  • 这里第一个模式是“{”,第二个模式是“}”*

谢谢

uplii1fm

uplii1fm1#

解决方案TXR

$ txr data.txr data
qwe rty
uio {asd fgh jkl zxc}
vbn
mqw rty

data是:

qwe rty
uio {asd
fgh jkl
zxc} vbn
mqw rty

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向下行进经过匹配的线以再次尝试匹配。

nxowjjhe

nxowjjhe2#

这可能对你有用(GNU sed):

sed '/{/{:a;N;/}/!ba;s/\n\+/ /g;s/}\s*/&\n/}' file

收集从{开始到}结束的行。
用空格替换每个换行符(或多个换行符)。
}后面插入一个换行符,并删除任何可能的白色。

相关问题