【问题标题】:Replace Windows filepath in text file by using a Linux sed regular expression使用 Linux sed 正则表达式替换文本文件中的 Windows 文件路径
【发布时间】:2018-04-23 15:27:25
【问题描述】:

我有大量具有类似标签语法的文本文件。这些文件包含这样的模式:

<TAG1=foo><TAG-2=\\10.0.0.1\directory\filename.pdf><TAG3> ...
<TAG4=bar><TAG-6=\\10.0.0.1\directory\filename.tif,other content><TAG5>

我需要将这些 UNC 路径的第一部分替换为新路径,意思是:

<TAG1=foo><TAG-2=D:\localdirectory\filename.pdf><TAG3> ...
<TAG4=bar><TAG-6=D:\localdirectory\filename.tif,other content><TAG7>

需要处理大量文件,因此我需要自动执行此路径替换。到目前为止,我用 sed(在 Linux 上)尝试了多个正则表达式,但没有接近解决方案。

#!/bin/bash

# New directory (escaped)
newpath='D:\\localdirectory\\'
# Actual replacement (don't work)
sed -i "s@\(<TAG-2=\)\([^\\]+\.pdf\)@\1${newpath}\2@g" filetoprocess.txt 
sed -i "s@\(<TAG-6=\)\([^\\]+\.tif\)@\1${newpath}\2@g" filetoprocess.txt 

欢迎提出建议

【问题讨论】:

    标签: regex linux windows parsing sed


    【解决方案1】:

    最后我得到了下面的正则表达式。此解决方案还可以管理 "/" Unix 路径、美元 ($) 和连字符 (-):

    sed -i -r 's@(<TAG-2=|TAG-6=)([\/]{2})([0-9.a-zA-Z_$ -]+[\/])+([0-9.a-zA-Z_$ -]+\.[pPtT][dDiI][fF])@\1'"${newpath}"'\\\4@g'
    

    【讨论】:

      【解决方案2】:

      这个使用 sed 的 shell 脚本可能会起作用:

      #!/bin/bash
      
      oldpath='\\\\10\.0\.0\.1\\directory\\'
      newpath='D:\\localdirectory\\'
      
      #sed -i "s@${oldpath}@${newpath}@g" filetoprocess.txt
      sed  -r -i "s@(<TAG-2=)${oldpath}([^>]+pdf)@\1${newpath}\2@g;
               s@(<TAG-6=)${oldpath}([^>]+tif)@\1${newpath}\2@g;
             " filetoprocess.txt
      

      在第一行中,shell shebang 是#!(注意感叹号)。而且我相信您输入示例中的第二行应该有 TAG-6。

      在路径中,需要注意正则表达式中具有特殊含义的字符:

      • 您必须使用反斜杠转义 .\
      • 这导致看起来很有趣的\\\\(两个转义的反斜杠)

      在最后一行中,-r 选项在参数中节省了一些转义。请注意,我使用[^&gt;]+ 而不是[^\\]+ 来获取扩展之前的路径部分。

      • sed 命令中的[^\\]+ 将匹配= 之后的所有内容,这不是\,而这只是D: 部分。
      • 因此您的替换将仅匹配文字 D:.pdf

      但我建议尝试使用其他(已注释的)sed 命令来替换路径,而不管 TAG 和文件扩展名是什么。

      (之前备份你的文件,因为你使用-i就地替换。)

      【讨论】:

      • @"Lars Fischer",感谢您提供详细的答案。当然,'olddpath' 在我需要修改的数万个文件中并不一致。一致的元素是 TAG 语法 &filepath pattern: '\\fqdn or IP\subdir\subdir\filename.ext'...还要注意 'filename.tif' 之后标记中的附加内容,并关闭 '>'。
      • @donmelchior 考虑 oldpathnewpath 是前缀。 ([^&gt;]+pdf) 应匹配前缀后面的以下路径部分,包括文件名和扩展名(在这种情况下为.pdf)。
      猜你喜欢
      • 2017-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-27
      • 1970-01-01
      相关资源
      最近更新 更多