sed를 사용하여 슬래시 경로를 루프의 백슬래시 경로로 바꿉니다.

sed를 사용하여 슬래시 경로를 루프의 백슬래시 경로로 바꿉니다.

Windows 서버 경로(\\100.100.0.0\aaa\bbb\ccc\)를 폴더(/xxx/yyy/zzz/)의 모든 .txt 파일에 나타나는 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

sh그럼에도 불구하고 , 가 아닌 다른 쉘을 사용하고 싶다면 bash상대적으로 좋지 않은 선택입니다(확실히 이번 세기에 사용해서는 안 되는 (t)csh만큼 나쁘지는 않습니다). zsh, ksh93 또는 Fish를 포함한 여러 쉘을 사용하면 더 쉽고 깔끔해집니다.

관련 정보