0

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

任何帮助,将不胜感激。

4

3 回答 3

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},打印所有剩菜。
于 2012-07-12T14:36:33.847 回答
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\!因标志的丑陋逃脱而受到赞誉。在脚本中,您可以将其保留。

于 2012-07-12T12:16:27.840 回答
0

这可能对您有用(GNU sed):

sed '$!N;s/\n\t/\t/;P;D' file
于 2012-07-12T15:51:22.387 回答