我想将文件夹 (/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 sh
,bash
则 是一个相对较差的选择(当然不如 (t)csh 差,在本世纪不应该使用它)。包括 zsh、ksh93 或 Fish 在内的几种 shell 会让它变得更容易、更干净。