我在使用sed将非打印字符替换为其他不可打印的字符时遇到问题。 具体来说,我希望sed在表格中查找以TAB开头并“插入”BACKSPACE的行,基本上将该行的文本带到上一行。
这样做的原因是我将一个表拆分成列,其中一些行占用了多行:
column1,row1 column2,row1,line1
column2,row1,line2
我希望它最终像这样(ish)
column1,row1 column2,row1,line1 column2,row1,line2
(间距无关紧要)
我似乎无法管理这个。我不确定表达式\ t sand \ b是否被识别,但它们似乎不是我尝试过的方式。我也无法使用这些
的八进制表示来获取echo命令这些是我尝试过的东西:
sed 's/^\t/\b/' file.txt newfile.txt
sed 's/^(`echo "\011"`)/`echo "\010"`/' file.txt newfile.txt
任何帮助都将不胜感激。
答案 0 :(得分:4)
我不会用sed这样做。当然,可以让sed在保持缓冲区中存储一行,然后读取下一行,如果它以空格开头,则弹出并打印保持缓冲区然后打印当前行......但代码看起来就像你的调制解调器一样失去了载体。
我会用awk。
awk '/^[^ \t]/ && buf{print buf;buf=""} {buf=buf $0} END{print buf}' input.txt
这是做什么的?
{buf=buf $0}
将当前行添加到名为buf
的缓冲区。/^[^ \t]/ && buf{print buf;buf=""}
(因第一行而被忽略,因为尚未设置buf
),为任何不以第一行开头的行打印buf
空白(即新输出行的开始)。然后重置buf
。END{print buf}
打印任何剩菜。答案 1 :(得分:1)
这对sed的使用非常难看,但有效:
echo "a
<TAB here>b
<TAB here>c
<TAB here>d
e" | sed ':begin N; /\n\t/'\!'n; s/\n\t//; t begin'
bash
因为\!
符号的丑陋逃脱而受到赞扬。在脚本中,您可以将其遗弃。
答案 2 :(得分:0)
这可能适合你(GNU sed):
sed '$!N;s/\n\t/\t/;P;D' file