sed
或awk
附加到上一行吗?
我有一个格式为
的文件 INT32
FSHL (const TP Buffer)
{
INT32
FSHL_lm (const TP Buffer)
{ WORD32 ugo = 0; ...
我要做的是扫描独立的开括号{
并将其附加到前一个非空白行。对于由同一行中的任何内容追加的开括号,不应该匹配。
预期产出:
INT32
FSHL (const TP Buffer){
INT32
FSHL_lm (const TP Buffer)
{ WORD32 ugo = 0; ...
感谢您的回复。
答案 0 :(得分:6)
这可能适合你(GNU sed):
sed '$!N;s/\n\s*{\s*$/{/;P;D' file
说明:
$!N
除非最后一行将下一行附加到模式空间。s/\n\s*{\s*$/{/
替换一个换行符,后面跟着没有或没有任何数量的空格,后跟一个开口的花括号,后面跟着没有或任何数量的空格到字符串的末尾,用一个开口的花括号。P
打印并包含第一个换行符。D
删除并包含第一个换行符(如果是这样,请不要开始新的循环)。答案 1 :(得分:2)
使用perl
的一种方法。我以slurp模式读取所有文件并使用正则表达式搜索只有大括号的行并删除其前导空格。
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; ...
答案 2 :(得分:2)
使用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
答案 3 :(得分:0)
[shyam @ localhost~] $ perl -lne&#39; s / ^ / \ n / if $。&gt; 1&amp;&amp; / ^ \ d + /; printf&#34;%s&#34;,$ _&#39; appendDateText.txt
将起作用
I / P:
06/12/2016 20:30测试测试
TESTTEST
06/12/2019 20:30 abbs abcbcb abcbc
06/11/2016 20:30测试
i123312331233123312331233123312331233123312331233Test
06/12/2016 20:30 abc
O / P:
06/12/2016 20:30 Test Test TestTestTest
06/12/2019 20:30 abbs abcbcb abcbc
06/11/2016 20:30测试## testi123312331233123312331233123312331233123312331233Test