什么是在sed中插入标签的正确方法?

什么是在sed中插入标签的正确方法? 我使用sed将一个标题行插入到一个stream中。 我大概可以用一个正则expression式来replace一些字符,但是有没有更好的办法呢?

例如,假设我有:

some_command | sed '1itextTABtext' 

我想第一行看起来像这样(文本由制表符分隔):

 text text 

我试图用“\ t”,“\ x09”,“”(标签本身)在上面的命令中replaceTAB。 我已经试过,没有双引号,我不能让sed在文本之间插入选项卡。

我正在试图在SLES 9中做到这一点。

Solutions Collecting From Web of "什么是在sed中插入标签的正确方法?"

你可以简单地使用sed i命令:

 some_command | sed '1i\ text text2' 

正如我希望的那样,在“文本”和“文本2”之间有一个标签。 在MacOS X(10.7.2)上,因此可能在其他基于BSD的平台上,我可以使用:

 some_command | sed '1i\ text\ttext2' 

sed翻译成一个标签。

如果sed不会解释\t并在命令行中插入标签是一个问题,请使用编辑器创建一个shell脚本并运行该脚本。

假设bash(也许其他shell也可以):

 some_command | sed $'1itext\ttext' 

Bash会在$' '内部处理\t类的转义符,然后将其作为arg传递给sed。

Sed可以做到这一点,但它是尴尬的:

 % printf "1\t2\n3\t4\n" | sed '1i\\ foo bar\\ ' foo bar 1 2 3 4 $ 

(双反斜杠是因为我使用tcsh作为我的shell;如果使用bash,请使用单个反斜杠)

foo和bar之间的空格是一个制表符,我通过用Ctrl V键来输入 。 您还需要在Ctrl + V的单引号内添加换行符。

用awk做这个可能会更简单/更清楚:

 $ printf "1\t2\n3\t4\n" | awk 'BEGIN{printf("foo\tbar\n");} {print;}' 

正如大多数答案所说,可能字面tab字符是最好的。

info sed说“ \ t不便携式 ”:

... '\CHAR' Matches CHAR, where CHAR is one of '$', '*', '.', '[', '\', or '^'. Note that the only C-like backslash sequences that you can portably assume to be interpreted are '\n' and '\'; in particular '\t' is not portable, and matches a 't' under most implementations of 'sed', rather than a tab character. ...

我找到了一种替代方法来使用替换插入一个选项卡。

some_command | sed '1s/^/text\ttext\n/'

我仍然不知道如何使用插入方法。

为了说明sed的BRE语法确实提到了\t不是可移植的,Git 2.13(Q2 2017)将其除掉。

见Junio C gitstergitster )的 提交fba275d (2017年4月1日) 。
(由Junio C gitster合并- gitster -在3c833ca ,2017年4月17日提交 )

contrib/git-resurrect.sh :不要在sed脚本中写入HT

就像我们在0d1d6e5中所做的那样 (“ t/t7003 :用sed表达式中的文本标签替换\t ”,2010-08-12,Git 1.7.2.2),避免在sed脚本中为HT写“ \t ”便携。

 - sed -ne 's~^\([^ ]*\) .*\tcheckout: moving from '"$1"' .*~\1~p' + sed -ne 's~^\([^ ]*\) .* checkout: moving from '"$1"' .*~\1~p' ^^^^ | (literal tab) 

注意:上面我们有两个反斜杠(\)第一个是用于转义(),而下一个是实际的选项卡字符(\ t)