test
다음과 유사한 파일이 있습니다.
hello
my
name
<h6>test morning</h6>
is
bob
나는 다음을 사용할 것이라는 것을 알고 있습니다.
sed -i -- 's/name//g' test
파일에서 삭제하고 싶은데 name
어떻게 해야 합니까 <h6>test morning</h6>
?
문자열은 파일의 어느 위치에나 있을 수 있으며 파일은 .css
또는 파일과 같은 .html
것이 될 수 있습니다.
답변1
이 경우에는 어떤 문자라도 사용할 수 있습니다 /
. 예를 들어
sed -i 's|<h6>test morning</h6>||g' test
문자열 마하 모드의 경우 첫 번째를 이스케이프해야 합니다.
sed -i '\|<h6>test morning</h6>|s///g' test
패턴이 거의 없다면 /
그냥 탈출하는 것이 쉬울 수도 있습니다.
sed -i '/<h6>test morning<\/h6>/s///g' test
답변2
Perl이 구출하러 옵니다!
Perl에서는 패턴 섹션에서 변수를 사용할 수 있으며 다음을 사용할 수 있습니다.참조 요소(또는 이에 상응하는 \Q
이스케이프) 특수 문자를 이스케이프 처리합니다.
REPLACE='<h6>test morning</h6>' perl -pe 's/\Q$ENV{REPLACE}//'
답변3
Perl을 사용하면 파일 및 디렉터리 경로에도 동일한 변경 사항을 적용할 수 있습니다... bash 기능으로 변환된 이 코드 조각은 지난 5년 동안 전문 프로젝트와 사이드 프로젝트에서 가장 많이 사용된 코드 조각이었습니다...
# some initial checks the users should set the vars in their shells !!!
test -z $dir_to_morph && exit 1 "You must export dir_to_morph=<<the-dir>> - it is empty !!!"
test -d $dir_to_morph || exit 1 "The dir to morph : \"$dir_to_morph\" is not a dir !!!"
test -z $to_srch && exit 1 "You must export to_srch=<<str-to-search-for>> - it is empty !!!"
test -z $to_repl && exit 1 "You must export to_repl=<<str-to-replace-with>> - it is empty !!!"
echo "INFO dir_to_morph: $dir_to_morph"
echo "INFO to_srch:\"$to_srch\" " ;
echo "INFO to_repl:\"$to_repl\" " ;
sleep 2
echo "INFO START :: search and replace in non-binary files"
#search and replace ONLY in the txt files and omit the binary files
while read -r file ; do (
#debug echo doing find and replace in $file
echo "DEBUG working on file: $file"
echo "DEBUG searching for $to_srch , replacing with :: $to_repl"
# we do not want to mess with out .git dir
# or how-to check that a string contains another string
case "$file" in
*.git*)
continue
;;
esac
perl -pi -e "s#\Q$to_srch\E#$to_repl#g" "$file"
);
done < <(find $dir_to_morph -type f -not -exec file {} \; | grep text | cut -d: -f1)
echo "INFO STOP :: search and replace in non-binary files"
#search and repl %var_id% with var_id_val in deploy_tmp_dir
echo "INFO search and replace in dir and file paths dir_to_morph:$dir_to_morph"
# rename the dirs according to the pattern
while read -r dir ; do (
perl -nle '$o=$_;s#'"\Q$to_srch\E"'#'"$to_repl"'#g;$n=$_;`mkdir -p $n` ;'
);
done < <(find $dir_to_morph -type d|grep -v '.git')
# rename the files according to the pattern
while read -r file ; do (
perl -nle '$o=$_;s#'"\Q$to_srch\E"'#'"$to_repl"'#g;$n=$_;rename($o,$n) unless -e $n ;'
);
done < <(find $dir_to_morph -type f -not -path "*/node_modules/*" |grep -v '.git'