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를 포함한 여러 쉘을 사용하면 더 쉽고 깔끔해집니다.