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'