插入物上的Sed过程替换 - 没有反斜杠

时间:2015-11-24 16:20:16

标签: sed

我有一个函数可以打印一个需要应用于多个文件的标题,但是如果我使用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

注意第一行末尾的反斜杠,我不希望出现反斜杠。有任何想法吗?

3 个答案:

答案 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。)