在sed中插入标签的正确方法是什么?我正在使用sed将标题行插入流中。之后我可能会使用正则表达式替换某个字符,但是有没有更好的方法呢?
例如,假设我有:
some_command | sed '1itextTABtext'
我希望第一行看起来像这样(文本由制表符分隔):
text text
我尝试用“\ t”,“\ x09”,“”(标签本身)替换上面命令中的TAB。我已尝试使用和不使用双引号,我无法在文本之间插入选项卡。
我试图在SLES 9中这样做。
答案 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 fba275d见Junio 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)