2012-07-12 81 views
0

我無法使用sed將非打印字符替換爲其他不可打印字符。 具體來說,我希望sed在表格中以TAB開始並在其中插入一個BACKSPACE,從而將該行中的文本引導至上一行。將sed與非打印字符配合使用

這樣做的原因是,我有一個表拆分成多列,一些行佔用多行:

column1,row1 column2,row1,line1 
       column2,row1,line2 

我想它最終會像這樣(ISH)

column1,row1 column2,row1,line1   column2,row1,line2 

(間距無關緊要)

雖然我似乎無法處理這個問題。我不確定表達式\ t sand \ b是否被識別,但它們似乎沒有按照我嘗試過的方式。我也不能獲得與這些

這些八進制表示回聲命令是我試過的那種東西:

sed 's/^\t/\b/' file.txt newfile.txt 


sed 's/^(`echo "\011"`)/`echo "\010"`/' file.txt newfile.txt 

任何幫助,將不勝感激。

+1

你真的想「插入退格」,或者這將是足以消除換行符?我的意思是,你的最終目標是將單行分成兩行,還是要插入實際的Ctrl-H? – ghoti 2012-07-12 11:18:47

+0

我試着展現出我想要發生的事情。我希望縮進的行(帶有製表符)與第二列對齊,以便與上面的行相同,以便每行都只佔用一行。對不起,如果不清楚。 – user1488804 2012-07-12 11:33:42

+0

我想你會混合使用「BACKSPACE」ASCII字符,Ctrl-H和編輯器命令「backspace」,通常分配給退格鍵和ctrl-h組合鍵。 插入BACKSPACE字符不會奇蹟般地刪除以前的字符。你需要運行一個編輯器並且一起按ctrl和H使編輯器移除該字符。 你真正需要做的是用\ t替換\ n \ t。我沒有時間測試確切的代碼 - 其他人是否可以提供該答案? – Arkadiy 2012-07-12 12:24:04

回答

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},打印任何剩菜。
+0

輝煌。太棒了 – user1488804 2012-07-12 15:23:32

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獲得信貸的\!標誌的醜陋逃逸。在腳本中,您可以將其保留。

+0

我把你的命令粘貼到我的腳本'sed'中:begin N;/\ n \ t /'\!'n; s/\ n \ t //; t開始' test2.txt'但運行後沒有任何變化它。我一定在做錯事,但我不知道是什麼。 – user1488804 2012-07-12 12:42:16

+0

也許你沒有標籤,但在你的文件中的空格? – 2012-07-12 13:49:57

+0

文件中沒有任何空格,全部選項卡。我剛剛確定併發生了相同的事情。我認爲bash無法理解\ n和\ t字符,只是忽略它們。 – user1488804 2012-07-12 14:41:20

0

這可能爲你工作(GNU SED):

sed '$!N;s/\n\t/\t/;P;D' file