awk bash repeat pattern

时间:2016-11-11 22:26:24

标签: awk sed git-bash

我目前有这个ORIGINAL字符串:

mklink .\Oracle\MOLT_HYB_01\110_Header\pkg_cdc_util.pks $.\Oracle\MOLT_HYB_01\110_Header\pkg_cdc_util.pks
#.......................................................^

....需要更换如下:

mklink .\Oracle\MOLT_HYB_01\110_Header\pkg_cdc_util.pks ..\..\..\..\.\Oracle\MOLT_HYB_01\110_Header\pkg_cdc_util.pks
#.......^......^...........^..........^.................^^^^^^^^^^^^

即。根据ORIGINAL字符串第二列中的斜杠数(“。\ Oracle \ MOLT_HYB_01 \ 110_Header \ pkg_cdc_util.pks”)将 $ 替换为“.. \”4次

我可以单独进行以下操作:

  1. awk -F '\\' '{print NF-1}' - >打印反斜杠的出现次数
  2. sed -e "s,\\\,$(printf '..\\\%.0s' {1..4}),g" - >替换并重复字符串模式
  3. ......但不确定如何在1个命令行中串起来。

3 个答案:

答案 0 :(得分:2)

awk命令,可以使用任意数量的输入行(具有相同的字段结构):

awk -v prefixUnit="..\\" '{
  count = gsub("\\\\", "\\", $2) # count the number of "\"s
  # Build the prefix composed of count prefixUnit instances
  prefix = ""; for (i=1; i<=count; ++i) prefix = prefix prefixUnit 
  $3 = prefix substr($3, 2) # prepend the prefix to the 3rd field, replacing the "$"
  print # print result
 }' file

作为浓缩的单行:

awk -v pu="..\\" '{n=gsub("\\\\","\\",$2);p="";for(i=1;i<=n;++i)p=p pu;$3=p substr($3,2);print}' file

答案 1 :(得分:0)

我使用perl,虽然这有点“聪明”

perl -ane '
    $n = ($F[1] =~ tr/\\/\\/);
    $F[2] =~ s{\$}{"..\\" x $n}e;
    print join(" ", @F);
' file

,其中

  • -a - 将该行自动分割为数组@F
  • -n - 为“file”
  • 的每一行执行正文
  • $F[1] =~ tr/\\/\\/ - 计算第二个字段中反斜杠的数量
  • $F[2] =~ s{\$}{"..\\" x $n}e - 用正确数量的“.. \”
  • 替换美元

答案 2 :(得分:0)

假设只有一行可以处理

,那就是单行代码
awk -F\\ -v RS='$' -v ORS='' '{print} NR==1{for(i=1; i< NF; i++) printf("..\\")}'

<强>解释

awk -F\\ -v RS='$' ' -v ORS='' ' # Specify separators

    {print}                      # print the line

    NR==1{                       # for first record
      for (i=1; i<NF; i++)       # print multiple ..\
         printf("..\\")          # need to escape \\
    }
'