我可以使用sed
或awk
如果找到匹配追加到前行?
我有一个有格式的文件:
INT32
FSHL (const TP Buffer)
{
INT32
FSHL_lm (const TP Buffer)
{ WORD32 ugo = 0; ...
我所试图做的是扫描独立的开括号{
并将其追加到以前的非空行.The比赛不应该由在同一行的任何附加的开括号出现。
预期的输出:
INT32
FSHL (const TP Buffer){
INT32
FSHL_lm (const TP Buffer)
{ WORD32 ugo = 0; ...
感谢您的答复。
这可能会为你工作(GNU SED):
sed '$!N;s/\n\s*{\s*$/{/;P;D' file
说明:
-
$!N
除非最后一行追加下一行到模式空间。 -
s/\n\s*{\s*$/{/
更换换行,随后没有或之后没有或任何的空白量的字符串的末尾的白色空间后跟一个大括号的任何量,由一个大括号。 -
P
打印高达和包括第一个换行符。 -
D
高达删除和包括第一个换行符(如果是的话不开始新的循环)。
使用的方法之一perl
。 我读啜食模式下的所有文件,并使用正则表达式搜索线只用花括号并删除其前导空格。
perl -ne '
do {
local $/ = undef;
$data = <>;
};
$data =~ s/\n^\s*(\{\s*)$/\1/mg;
print $data
' infile
假设infile
有问题的内容,输出将是:
FSHL (const TP Buffer){
INT32
FSHL_lm (const TP Buffer)
{ WORD32 ugo = 0; ...
使用一种方法awk
:
awk '!(NF == 1 && $1 == "{") { if (line) print line; line = $0; next; } { sub(/^[ \t]+/, "", $0); line = line $0; } END { print line }' file.txt
还是爆发了多条线路:
!(NF == 1 && $1 == "{") {
if (line) print line
line = $0
next
}
{
sub(/^[ \t]+/, "", $0)
line = line $0
}
END {
print line
}
结果:
INT32
FSHL (const TP Buffer){
INT32
FSHL_lm (const TP Buffer)
{ WORD32 ugo = 0; ...
HTH
[希亚姆@本地〜] $ perl的-lne的/ ^ / \ N /如果$> 1 && / ^ \ d + /。 printf的 “%S”,$ _” appendDateText.txt
那可行
I / P:
2016年6月12日20:30测试测试测试
测试一下
2019年12月6日下午8点三十ABB abcbcb abcbc
2016年6月11日20:30测试测试
i123312331233123312331233123312331233123312331233Test
2016年6月12日20:30 ABC
O / P:
2016年6月12日20:30测试测试TestTestTest
2019年12月6日下午8点三十ABB abcbcb abcbc
2016年6月11日20时三十分测试## testi123312331233123312331233123312331233123312331233Test