sed "s/\(.*\)/\t\1/" $filename > $sedTmpFile && mv $sedTmpFile $filename
Run Code Online (Sandbox Code Playgroud)
我期待这个sed脚本插入每行的字体中的选项卡,$filename但它不是.由于某种原因,它插入而不是..奇怪..
Mar*_*ers 116
并非所有版本的sed理解\t.只需插入一个文字标签(按Ctrl- V然后Tab).
小智 40
使用Bash,您可以编程方式插入TAB字符,如下所示:
TAB=$'\t'
echo 'line' | sed "s/.*/${TAB}&/g"
echo 'line' | sed 's/.*/'"${TAB}"'&/g' # use of Bash string concatenation
Run Code Online (Sandbox Code Playgroud)
Bru*_*sky 23
@sedit是在正确的道路上,但定义一个变量有点尴尬.
在bash中执行此操作的方法是使用在单引号字符串前面放置一个美元符号.
$ echo -e '1\n2\n3'
1
2
3
$ echo -e '1\n2\n3' | sed 's/.*/\t&/g'
t1
t2
t3
$ echo -e '1\n2\n3' | sed $'s/.*/\t&/g'
1
2
3
Run Code Online (Sandbox Code Playgroud)
如果您的字符串需要包含变量扩展,您可以将引用的字符串放在一起,如下所示:
$ timestamp=$(date +%s)
$ echo -e '1\n2\n3' | sed "s/.*/$timestamp"$'\t&/g'
1491237958 1
1491237958 2
1491237958 3
Run Code Online (Sandbox Code Playgroud)
在bash中$'string'导致"ANSI-C扩展".这也正是我们大多数人的预料,当我们使用之类的东西\t,\r,\n等来源:https://www.gnu.org/software/bash/manual/html_node/ANSI_002dC-Quoting.html#ANSI_002dC-Quoting
$'string'形式的单词是专门处理的.单词扩展为字符串,替换为ANSI C标准指定的反斜杠转义字符.反斜杠转义序列(如果存在)将被解码...
扩展结果是单引号,好像美元符号不存在一样.
我个人认为大多数避免使用bash的努力都是愚蠢的,因为避免使用bashisms并不能使你的代码可移植.(你的代码将不那么脆弱,bash -eu如果你试图避免bash并使用sh[除非你是一个绝对的POSIX忍者].)但是,而不是有一个宗教论点,我会给你最好的*回答.
$ echo -e '1\n2\n3' | sed "s/.*/$(printf '\t')&/g"
1
2
3
Run Code Online (Sandbox Code Playgroud)
*最佳答案?是的,因为大多数反bash shell脚本编写者在代码中出错的一个例子echo '\t'就像@ robrecord的回答一样.这适用于GNU echo,但不适用于BSD echo.这一点由The Open Group在http://pubs.opengroup.org/onlinepubs/9699919799/utilities/echo.html#tag_20_37_16解释.这就是为什么试图避免bashisms通常会失败的一个例子.
我在Ubuntu 12.04(LTS)上使用了类似的东西和Bash shell:
要添加带选项卡的新行,请在第一个匹配时添加第二行:
sed -i '/first/a \\t second' filename
Run Code Online (Sandbox Code Playgroud)
首先用tab替换,第二个:
sed -i 's/first/\\t second/g' filename
Run Code Online (Sandbox Code Playgroud)
使用$(echo '\t')。您需要在模式周围加上引号。
例如。要删除选项卡:
sed "s/$(echo '\t')//"
Run Code Online (Sandbox Code Playgroud)