我有一个函数可以打印一个需要应用于多个文件的标题,但是如果我使用sed进程替换,那么前一行之前的行会对它们产生反斜杠\。
E.g。
function print_header() {
cat << EOF
-------------------------------------------------------------------
$(date '+%B %d, %Y @ ~ %r') ID:$(echo $RANDOM)
EOF
}
如果我然后选择test.txt
这样的文件:
第1行
第2行
第3行
第4行
第5行
sed "1 i $(print_header | sed 's/$/\\/g')" test.txt
我明白了:
-------------------------------------------------------------------\
November 24, 2015 @ ~ 11:18:28 AM ID:13187
line 1
line 2
line 3
line 4
line 5
注意第一行末尾的反斜杠,我不希望出现反斜杠。有任何想法吗?
答案 0 :(得分:0)
我会用猫来表示:
cat <(print_header) file > file_with_header
答案 1 :(得分:0)
这是我的kludgy修复,如果你能找到更优雅的东西我会很高兴地相信你:
sed "1 i $(print_header | sed 's/$/\\/g;$s/$/\x01/')" test.txt | tr -d '\001'
这会在插入的文本后放置一个不可打印的SOH(\ x01)ascii Start Of Header字符,这会排除反斜杠,然后我在tr
上运行它以删除SOH字符。
答案 2 :(得分:0)
此行为取决于vnix$ sed '1i\
> foo\
> bar' <<':'
> hello
> goodbye
> :
foo
bar
hello
goodbye
方言。不幸的是,这取决于你拥有哪个版本。
要简化调试,请尝试指定逐字文本。这是来自Debian系统的一个。
sed
您的诊断信息似乎表明您的i
方言在第一个cat <<EOF test.txt
之后实际上不需要反斜杠。
由于您无论如何都以编程方式生成标头的内容,我建议的解决方案是重构代码,以便您可以避免这个难题。如果您不想sed 1r/dev/stdin' <<EOF test.txt
,那么可以试用1r-
(我无法让/dev/stdin
工作,但 axes();
hold('on');
for l=1:mstlength
vl = mst(l,1);
for p=1:mstlength
vp = mst(p,2);
plot([nodes(vl,2) nodes(vp,2)],[nodes(vl,3) nodes(vp,3)],'k.-');
end;
end;
应该可移植到任何Linux。)