Bash 附加到前一行以进行匹配
如果找到匹配项,是否可以使用Bash 附加到前一行以进行匹配,bash,shell,sed,awk,Bash,Shell,Sed,Awk,如果找到匹配项,是否可以使用sed或awk附加到前一行 我有一个文件,其格式如下: INT32 FSHL (const TP Buffer) { INT32 FSHL_lm (const TP Buffer) { WORD32 ugo = 0; ... 我试图做的是扫描独立的大括号{,并将其附加到前一个非空行中。在同一行中附加任何内容的大括号不应出现匹配 预期产出
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; ...
感谢您的回复。这可能适合您(GNU sed):
说明:
除非最后一行将下一行附加到图案空间$!N
将换行符后跟无空格或任意数量的空格替换为开头的大括号,在字符串末尾后跟无空格或任意数量的空格,替换为开头的大括号s/\n\s*{\s*$/{/
打印到并包括第一个换行符P
删除并包括第一个换行符(如果是,则不要开始新的循环)D
perl
的一种方法。我以slurp模式读取所有文件,并使用正则表达式仅使用大括号搜索行,并删除其前导空格
perl -ne '
do {
local $/ = undef;
$data = <>;
};
$data =~ s/\n^\s*(\{\s*)$/\1/mg;
print $data
' infile
单向使用
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[shyam@localhost~]$perl-lne的/^/\n/if$.>1&&/^\d+/;printf“%s”,$appendDateText.txt 那就行了 i/p: 2016年12月6日20:30测试 测试 2019年12月6日20:30 abbs abcb abcbc 2016年11月6日20:30测试 I1233123312331233123312331233123312331233123312331233123312331233测试 2016年12月6日20:30美国广播公司 o/p: 2016年12月6日20:30测试 2019年12月6日20:30 abbs abcb abcbc
2016年11月6日20:30 test##test1233123312331233123312331233123312331233test如果大括号后面有空格,regexp
!/{$/
将失败。同样对于像[{
这样的行,因为它前面没有检查任何内容。也许OP可以接受它,但我会使用更紧的!(NF==1&$1=“{”)< /代码>或<代码>!/^ *{*$/< />代码。@ BiRe:谢谢,你是对的。我没有考虑过比空白更重要的字符。因为某种原因,我不知道。“史提夫谢谢!我的作品!”打印行
do?@ArchStanton:如果已经定义了'line'变量,那么它将打印该变量的值。效果很好!您能给正则表达式添加一个简短的描述吗:)
!(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; ...