2

我正在使用 Windows sed / awk 但 unix 命令类似,

文件 1

\\FILE09\12GAGE\LOAN CLOSING UNIT;\\FILE09\12GAGE;/fs8_100X/FILE09/bu/12gage
\\FILE44\FILE44\BU\EARPS\FUNDCHECK;\\FILE44\FILE44;/fs6_451B/FILE44
\\FILE15\FILE15\BU\MICROSOFT MACRO REMEDIATION;\\FILE15\FILE15;/fs6_100X/FILE15

所需输出:

\\FILE09\12GAGE\LOAN CLOSING UNIT;\\FILE09\12GAGE;/fs8_100X/FILE09/bu/12gage/LOAN CLOSING UNIT
\\FILE44\FILE44\BU\EARPS\FUNDCHECK;\\FILE44\FILE44;/fs6_451B/FILE44/BU/EARPS/FUNDCHECK
\\FILE15\FILE15\BU\MICROSOFT MACRO REMEDIATION;\\FILE15\FILE15;/fs6_100X/FILE15/BU/MICROSOFT MACRO REMEDIATION

我需要抓取第一个字段,例如在第 4 次出现 backslack 之后抓取字符串:

\\FILE44\FILE44\BU\EARPS\FUNDCHECK

它将是 \BU\EARPS\FUNDCHECK,然后将反斜杠转换为斜杠: /BU/EARPS/FUNDCHECK 然后将其附加到该行的末尾。

\\FILE44\FILE44\BU\EARPS\FUNDCHECK;\\FILE44\FILE44;/fs6_451B/FILE44/BU/EARPS/FUNDCHECK
4

5 回答 5

2

这是一种使用方法awk

awk -F ";" '{ a = $0; sub(/^\\\\[^\\]*\\[^\\]*/,""); gsub(/\\/,"/",$1); print a $1 }' file

或简化正则表达式:

awk -F ";" '{ a = $0; sub(/^\\(\\[^\\]*){2}/,""); gsub(/\\/,"/",$1); print a $1 }' file

结果:

\\FILE09\12GAGE\LOAN CLOSING UNIT;\\FILE09\12GAGE;/fs8_100X/FILE09/bu/12gage/LOAN CLOSING UNIT
\\FILE44\FILE44\BU\EARPS\FUNDCHECK;\\FILE44\FILE44;/fs6_451B/FILE44/BU/EARPS/FUNDCHECK
\\FILE15\FILE15\BU\MICROSOFT MACRO REMEDIATION;\\FILE15\FILE15;/fs6_100X/FILE15/BU/MICROSOFT MACRO REMEDIATION
于 2012-12-21T23:13:31.000 回答
1

这个单线可能工作:

 awk -F';' '{x=$1;sub(/\\\\[^\\]+\\[^\\]+\\/,"",x);gsub(/\\/,"/",x);print $0"/"x}' file

测试

kent$  awk -F';' '{x=$1;sub(/\\\\[^\\]+\\[^\\]+\\/,"",x);gsub(/\\/,"/",x);print $0"/"x}' test
\\FILE09\12GAGE\LOAN CLOSING UNIT;\\FILE09\12GAGE;/fs8_100X/FILE09/bu/12gage/LOAN CLOSING UNIT
\\FILE44\FILE44\BU\EARPS\FUNDCHECK;\\FILE44\FILE44;/fs6_451B/FILE44/BU/EARPS/FUNDCHECK
\\FILE15\FILE15\BU\MICROSOFT MACRO REMEDIATION;\\FILE15\FILE15;/fs6_100X/FILE15/BU/MICROSOFT MACRO REMEDIATION
于 2012-12-21T23:13:59.197 回答
1

使用 sed:

sed -e 's/\(\([^\\]*\\\)\{4\}\)\([^;]*\);\(.*\)/\1\3;\4\/\3/' 
    -e ':l s/\([^;]*;[^;]*;[^\\]*\)\\/\1\//;t l' input
于 2012-12-21T23:18:15.910 回答
1

这可能对您有用(GNU sed):

sed -r 'h;s/^(([\\][^\\]*){3})([^;]*).*/\3/;y/\\/\//;H;g;s/\n//' file
  • h将原始行复制到保留空间 (HS)
  • s/^(([\\][^\\]*){3})([^;]*).*/\3/隔离有问题的字符串
  • y/\\/\//\'s替换/'s
  • H将修改后的字符串附加到 HS 中的原始行(引入换行符)
  • g将修改后的行检索到模式空间 (PS)
  • s/\n//删除换行符
于 2012-12-22T09:26:22.397 回答
0
awk -F";" '{n=split($1,a,"\\");$0=$0"/"a[n];print $0}' your_file

测试如下:

 cat temp
\\FILE09\12GAGE\LOAN CLOSING UNIT;\\FILE09\12GAGE;/fs8_100X/FILE09/bu/12gage
\\FILE44\FILE44\BU\EARPS\FUNDCHECK;\\FILE44\FILE44;/fs6_451B/FILE44
\\FILE15\FILE15\BU\MICROSOFT MACRO REMEDIATION;\\FILE15\FILE15;/fs6_100X/FILE15

> awk -F";" '{n=split($1,a,"\\");$0=$0"/"a[n];print $0}' temp
\\FILE09\12GAGE\LOAN CLOSING UNIT;\\FILE09\12GAGE;/fs8_100X/FILE09/bu/12gage/LOAN CLOSING UNIT
\\FILE44\FILE44\BU\EARPS\FUNDCHECK;\\FILE44\FILE44;/fs6_451B/FILE44/FUNDCHECK
\\FILE15\FILE15\BU\MICROSOFT MACRO REMEDIATION;\\FILE15\FILE15;/fs6_100X/FILE15/MICROSOFT MACRO REMEDIATION
>
于 2012-12-24T11:19:58.027 回答