我有trail.txt
,其中包含spice
网表。现在我想将所有扩展参数仅替换为一行,即删除+
该行并将其附加到上一行。
踪迹.txt
data
+ net06706 net06707
+ net221 net222 net223
m1 net10 rwl vdda vss nch l="l1pg+0.005u" w=w1pg+0.105u
m0 vdda rwld net10 vss nch l="l1pg+0.005u" w=w1pg+0.105u
(所需)trail.txt
data net06706 net06707 net221 net222 net223
m1 net10 rwl vdda vss nch l="l1pg+0.005u" w=w1pg+0.105u
m0 vdda rwld net10 vss nch l="l1pg+0.005u" w=w1pg+0.105u
命令
sed -e 's/^+/\b/g' trail.txt
我尝试替换,+
但backspace
没有成功。有没有其他方法可以解决这个问题?还有其他替代方案吗?
答案1
我不认为你可以使用退格方法 - 但是你可以做类似的事情
sed -e :a -e '$!N;s/\n+/ /;ta' -e 'P;D' trail.txt
看著名的 Sed 行话解释,第一部分:文件间距、编号以及文本转换和替换,40. 如果前一行以等号“=”开头,则在前一行后面追加一行(明显替换为+
)=
。
答案2
FWIW、GNUawk
awk -vRS='\\n\\+?' '{ORS=RT == "\n+"? "":RT; print}' trail.txt
data net06706 net06707 net221 net222 net223
m1 net10 rwl vdda vss nch l="l1pg+0.005u" w=w1pg+0.105u
m0 vdda rwld net10 vss nch l="l1pg+0.005u" w=w1pg+0.105u
答案3
几个想法,因为使用 sed 会有点棘手:
perl -00 -pe 's/\n\+\s*/ /g' file
awk '
{
if (/^\+/)
sub(/^\+[[:blank:]]*/, " ", $0)
else
if (NR > 1) print ""
printf "%s", $0
}
END {print ""}
' file
答案4
GNU sed
允许不用于perl
这样简单的任务:
sed -z 's/\n+//g' trail.txt