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

时间:2011-12-05 23:54:17

标签: linux sed

在sed中插入标签的正确方法是什么?我正在使用sed将标题行插入流中。之后我可能会使用正则表达式替换某个字符,但是有没有更好的方法呢?

例如,假设我有:

some_command | sed '1itextTABtext'

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

text    text

我尝试用“\ t”,“\ x09”,“”(标签本身)替换上面命令中的TAB。我已尝试使用和不使用双引号,我无法在文本之间插入选项卡。

我试图在SLES 9中这样做。

7 个答案:

答案 0 :(得分:12)

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

some_command | sed $'1itext\ttext'

Bash将在\t内处理转义,例如$' ',然后将其作为arg传递给sed。

答案 1 :(得分:11)

您只需正确使用sed i命令:

some_command | sed '1i\
text    text2'

其中,我希望很明显,'text'和'text2'之间有一个标签。在MacOS X(10.7.2)上,因此可能在其他基于BSD的平台上,我能够使用:

some_command | sed '1i\
text\ttext2'

sed\t翻译成了一个标签。

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

答案 2 :(得分:3)

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;}'

答案 3 :(得分:3)

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

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. ...

答案 4 :(得分:1)

我找到了另一种使用替换插入标签的方法。

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

我仍然不知道使用insert方法的方法。

答案 5 :(得分:1)

为了说明BRE syntax for sed确实提到contrib/git-resurrect.sh不可移植的事实,Git 2.13(2017年第2季度)摆脱了它。

commit fba275dJunio C Hamano (gitster)(2017年4月1日) Junio C Hamano -- gitster --合并于commit 3c833ca,2017年4月17日)

  

\t:不要在sed脚本中为HT写t/t7003

     

就像我们在0d1d6e5中所做的那样(" \t:用文字标签替换sed   在\t表达式",2010-08-12,Git 1.7.2.2)中,避免编写" sed"对于- sed -ne 's~^\([^ ]*\) .*\tcheckout: moving from '"$1"' .*~\1~p' + sed -ne 's~^\([^ ]*\) .* checkout: moving from '"$1"' .*~\1~p' ^^^^ | (literal tab) 脚本中的HT,这是不可移植的。

{{1}}

答案 6 :(得分:1)

转义制表符:

sed -i '/<setup>/ a \\tmy newly added line' <file_name>

注意:上面我们有两个反斜杠(\),第一个用于转义(),下一个是实际的tab char(\ t)