我目前有这个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次
我可以单独进行以下操作:
awk -F '\\' '{print NF-1}'
- >打印反斜杠的出现次数sed -e "s,\\\,$(printf '..\\\%.0s' {1..4}),g"
- >替换并重复字符串模式......但不确定如何在1个命令行中串起来。
答案 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 \\
}
'