用sed替换前导制表符和空格

分享于 

3分钟阅读

电脑

  繁體 雙語

问题:

我想分别用 <TAB><SPACE> 替换前导制表符和空格。 但是我不知道如何在单一的sed 中进行操作,因为原始文件中的选项卡和空格可以混合。

输入示例( 显示为^的选项卡):


^^line with tabs


 line with spaces


^ ^intermixed



所需输出:


<TAB><TAB>line with tabs


<SPACE><SPACE>line with spaces


<TAB><SPACE><TAB>intermixed




回答 1:

我知道你说你要用 sed 这通常是个很好的工具。 但在选择和循环的地方,我发现 awk的优势。


#!/usr/bin/gawk -f


{ while (/^s/) {


 if (sub(/^/,"")) printf"<space>";


 if (sub(/^t/,"")) printf"<tab>";


 }


 print;


}



如果我们创建一个包含输入示例的文件 input.txt,并命名脚本 replace,它将按如下所示运行。

 
replace input.txt



 

更新:在代码中有一个无限循环。 序列 s 匹配 [ tnrfv],所以如果存在一个散列表提要,它将永远旋转。 但是 [:blank:] 只匹配空格和制表符,所以第二行应该是。


{ while (/^[[:blank:]]/) {




回答 2:

一个解决方案,它将行拆分为开始的选项卡和空格,以避免替换文本中的任何选项卡和空格。


echo -e 'ttline withttabs


 line with spaces


t tintermixed' | sed -r '



 # On the lines that start with tab or space.


/^[t ]/{



 # Put the whole line in the hold space.


 h



 # Delete all tabs and spaces at the start of line.


 s/^[t ]+//



 # Exchange pattern and hold spaces.


 # This saves the text part to the hold space and


 # bring back the original line to the pattern space.


 x



 # Now let in pattern space only tabs and spaces


 # at the start of line (the rest is on hold space).


 s/^([t ]+).*/1/



 # At least make the substitutions.


 s/t/<TAB>/g


 s//<SPACE>/g



 # Add a n (new line) at the end of pattern space,


 # then get the content of hold space and append it


 # to pattern space. 


 G



 # Delete the extra n added 上面.


 s/n//


 }'


<TAB><TAB>line with tabs


<SPACE><SPACE>line with spaces


<TAB><SPACE><TAB>intermixed





rep  tab  spa  repl  替换  Space  
相关文章