使用带有不可打印字符的sed

时间:2012-07-12 11:07:10

标签: regex unix sed

我在使用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

任何帮助都将不胜感激。

3 个答案:

答案 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