在保留子栏的同时在子字符串后添加空格

时间:2018-09-25 07:57:40

标签: linux bash sed spaces

我有一个像这样的数据文件:

randomthingsbefore $DATAROOT/randompathwithoutanypattern randomthingsafter
randomthingsbefore $DATAROOT/randompathwithoutanypattern randomthingsafter $DATAROOT/randompathwithoutanypattern randomthingsafter
randomthingsbefore $DATAROOT/randompathwithoutanypattern randomthingsafter
(...)

我想从每个路径中删除子字符串 $ DATAROOT ,并在路径后添加空格,以保留 randomthingsafter 开始的列。请注意,同一行中的 $ DATAROOT 子字符串可能有2条或更多条路径。这样,我想要的输出将如下所示:

randomthingsbefore /randompathwithoutanypattern          randomthingsafter
randomthingsbefore /randompathwithoutanypattern          randomthingsafter /randompathwithoutanypattern          randomthingsafter
randomthingsbefore /randompathwithoutanypattern          randomthingsafter
(...)

我尝试过:

VAR1=*pathtofile*

VAR2=$(\grep -oP '\$DATAROOT\K[^ ]*' $VAR1)
arr=$(echo $VAR2 | tr " " "\n")  

 for x in $arr
 do
   y="${x}          "
   sed -i "s:$x:$y:" $VAR1
 done

sed -i 's/$DATAROOT\///g' $VAR1

,但似乎不起作用。谢谢您的帮助!

1 个答案:

答案 0 :(得分:1)

我相信最简单的方法就是使用替换一行脚本:

sed 's/$DATAROOT\([^[:blank:]]*\)/\1         /g' /path/to/file

请注意,\1后面是9个空格,它是字符串$DATAROOT的长度。在这里,我们利用所谓的后向引用

  

sed中的编辑命令

     

[2addr]s/BRE/replacement/flags:   将替换字符串替换为模式空间中BRE的实例。可以使用以外的任何字符代替来分隔BRE和替换字符。在BRE及其替换中,如果BRE分隔符本身以开头,则可以用作文字字符。

     

应从头到尾扫描替换字符串。替换中出现的<&符号>(&)应该由与BRE匹配的字符串替换。在此上下文中,&的特殊含义可以通过在其前面加上来取消。字符\n,其中n为数字,应替换为与相应反向引用表达式匹配的文本。如果相应的反向引用表达式不匹配,则字符\n将被空字符串替换。 \n的特殊含义(此处n是数字)可以通过在其前面加上来抑制。对于遇到的每个,以下字符将失去其特殊含义(如果有)。

     

来源:POSIX SED

     

9.3.6匹配多个字符的BRE

     
      
  1. 后向引用表达式\n应与由\(前的\)\n之间的子表达式匹配的相同(可能为空)字符串匹配。字符n是从19的数字,指定第n个子表达式(从第n个\(开始的子表达式模式,并以相应的成对\)结束)。如果\n之前少于n个子表达式,则该表达式无效。由包含的子表达式匹配的字符串应在包含的子表达式匹配的字符串内。如果包含子表达式不匹配,或者在包含子表达式匹配的字符串中不存在包含子表达式的匹配项,则对应于包含子表达式的反向引用表达式将不匹配。当一个子表达式匹配多个字符串时,与该子表达式相对应的后向引用表达式应引用最后一个匹配的字符串。例如,表达式^\(.*\)\1$匹配由相同子字符串的两个相邻外观组成的字符串,表达式\(a\)*\1不能匹配a,表达式\(a\(b\)*\)*\2不能匹配{ {1}},表达式abab匹配^\(ab*\)*\1$,但不匹配ababbabb
  2.   
     

来源:POSIX Basic Regular Expressions