在循环中用 sed 替换正斜杠路径的反斜杠路径

在循环中用 sed 替换正斜杠路径的反斜杠路径

我想将文件夹 (/xxx/yyy/zzz/) 中所有 .txt 文件中出现的所有位置的 Windows 服务器路径 (\\100.100.0.0\aaa\bbb\ccc\) 替换为 Linux 路径 /foo/bar/ 。

为此,我做了一个循环,似乎在 bash 或 tcsh 上都不起作用(使用 foreach)。

#!/bin/bash
FILES="/xxx/yyy/zzz/*.txt"
for f in $FILES
do
        sed -i 's+\\100.100.0.0\aaa\bbb\ccc\+/foo/bar/+g' $f
done

我得到的错误如下:

sed: -e expression #1, char 133: unterminated `s' command

我猜测问题一定在于 sed 如何处理这些棘手的字符,但我无法识别它。

先感谢您。

答案1

\是正则表达式语法(以及许多其他事物)中的转义运算符,因此需要对其本身进行转义,同时.它也很特殊。这里,\前面的 导致 中不将 当作分隔+符。+s+pattern+replacement+flag

您也不需要循环或 bash。

#! /bin/sh -
sed -i 's|\\\\100\.100\.0\.0\\aaa\\bbb\\ccc\\|/foo/bar/|g' /xxx/yyy/zzz/*.txt

如果你想使用 bash 和变量,你宁愿使用数组:

#! /bin/bash -
shopt -s nullglob
files=( /xxx/yyy/zzz/*.txt )
if (( ${#files[@]} > 0 )); then
  sed -i -- 's|\\\\100\.100\.0\.0\\aaa\\bbb\\ccc\\|/foo/bar/|g' "${files[@]}"
fi

不过,如果您要使用 以外的 shell shbash则 是一个相对较差的选择(当然不如 (t)csh 差,在本世纪不应该使用它)。包括 zsh、ksh93 或 Fish 在内的几种 shell 会让它变得更容易、更干净。

相关内容