【问题标题】:Use sed to replace all backslashes with forward slashes使用 sed 将所有反斜杠替换为正斜杠
【发布时间】:2011-10-14 17:47:38
【问题描述】:

我希望能够使用 sed 接受输入,例如:

C:\Windows\Folder\File.txt

到

C:/Windows/Folder/File.txt

【问题讨论】:

    标签: bash shell sed


    【解决方案1】:

    你可以试试

    sed 's:\\:\/:g'`
    

    第一个\ 是插入一个输入,第二个\ 将是您要替换的那个。

    所以它是“:”第一个斜杠“\”第二个斜杠“\”“:”“\”插入输入“/”作为将呈现的新斜杠“:”g'

    \\ \/ 
    

    就是这样。它会起作用的。

    【讨论】:

      【解决方案2】:
      $ echo "C:\Windows\Folder\File.txt" | sed -e 's/\\/\//g'
      C:/Windows/Folder/File.txt
      

      本例中的 sed 命令为 's/OLD_TEXT/NEW_TEXT/g'。

      前导的 's' 只是告诉它搜索 OLD_TEXT 并将其替换为 NEW_TEXT。

      尾随的“g”只是表示替换给定行上的所有匹配项,而不仅仅是第一个。

      当然,您需要将“s”、“g”、旧的和新的相互分开。这是您必须使用正斜杠作为分隔符的地方。

      对于您的情况 OLD_TEXT == '\' 和 NEW_TEXT == '/'。但是你不能只是在输入斜杠的同时期望事情按预期工作字​​面意思,同时将它们用作分隔符。一般来说,斜线非常特殊,必须这样处理。它们必须用反斜杠“转义”(即前面)。

      所以对你来说,OLD_TEXT == '\\' 和 NEW_TEXT == '\/'。将这些放在's/OLD_TEXT/NEW_TEXT/g' 范式中,您将得到
      's/\\/\//g'。读作
      's / \\ / \/ / g' 转义后是
      's / \ / / / g' 将用正斜杠替换所有反斜杠。

      【讨论】:

        【解决方案3】:

        我必须使用 [\\] 或 [/] 才能完成这项工作,仅供参考。

        awk '!/[\\]/' file > temp && mv temp file

        和

        awk '!/[/]/' file > temp && mv temp file

        我使用 awk 从列表中删除反斜杠和正斜杠。

        【讨论】:

          【解决方案4】:

          如果您的文本在 Bash 变量中,则参数替换 ${var//\\//} 可以替换子字符串:

          $ p='C:\foo\bar.xml'
          $ printf '%s\n' "$p"
          C:\foo\bar.xml
          $ printf '%s\n' "${p//\\//}"
          C:/foo/bar.xml
          

          这可能比通过tr 或sed 等命令进行过滤更简洁明了。

          【讨论】:

            【解决方案5】:

            对我来说,这用正斜杠替换了一个反斜杠。

            sed -e "s/\\\\/\//"  file.txt
            

            【讨论】:

              【解决方案6】:

              这可能对你有用:

              sed 'y/\\/\//'
              

              【讨论】:

                【解决方案7】:

                如果只是将一个字符翻译成另一个字符,tr 是最好的工具:

                tr '\\' '/'
                

                【讨论】:

                • 顺便说一句,“tr”比“sed”更简单,而且速度更快。
                • tr 不是最好的工具。字符串替换是。虽然tr 比sed 更简单,但它仍然比使用内置shell 要多得多。
                【解决方案8】:

                只需使用:

                sed 's.\\./.g'
                

                没有理由在sed 中使用/ 作为分隔符。但如果你真的想:

                sed 's/\\/\//g'
                

                【讨论】:

                • 这很好,我猜你不需要在第一种情况下转义正斜杠,因为分隔符是'。'但是你为第二种情况做。甚至以下作品! $ echo "C:\Windows\Folder\File.txt" | sed -e 'sf\\f/fg' C:/Windows/Folder/File.txt sed 是否只取 's' 之后的第一个字符,并且必须转义该字符的进一步出现?
                【解决方案9】:

                sed 可以对来自文件或管道的输入流执行文本转换。示例:

                echo 'C:\foo\bar.xml' | sed 's/\\/\//g'
                

                得到

                C:/foo/bar.xml
                

                【讨论】:

                • \\ - 第一个 '\' 转义第二个,以便用作字符而不是指令。
                • 你可以给sed另外一个分隔符,比如.然后写不带双擒纵s.\\./.g
                • 我需要它用于wsl2,我在wsl中使用debian,但在这里它不起作用,结果是C: \n oar.xml。 tr 也没有..
                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2017-06-15
                • 1970-01-01
                • 2023-01-27
                • 2023-03-10
                相关资源
                最近更新 更多