A essência da sua pergunta é como substituir uma barra invertida (por exemplo, \
) por uma barra (ou seja, /
) chamando sed
de find
. Para fazer isso, você tem que fazer uma dupla saída das barras invertidas, porque a string será processada duas vezes: uma vez pela invocação de find
e, em seguida, uma segunda vez pela invocação de sed
. Isso deve fornecer o seguinte:
find . -type f -path '*/mod/*.dct' -execdir sh -c "sed -e 's/cd c:\\project\\data\\/cd \/project\/data\//' $(basename {}) > $(basename {}).mod" \;
Segue uma explicação mais detalhada.
Primeiro, vamos configurar um exemplo um pouco mais simples do seu problema:
# Create a target directory
mkdir -p /tmp/dir1/mod/dir2
# Create a text file containing a backslash
echo '\' > /tmp/dir1/mod/dir2/file.dct
Agora, vamos tentar usar find
e sed
para substituir essa barra invertida por uma barra:
find /tmp/dir1 -type f -path '*/mod/*.dct' -execdir sh -c "sed -e 's/\/\//' $(basename {})" \;
Isso produz o seguinte erro:
sed: -e expression #1, char 7: unterminated 's' command
Isso porque o comando sed
que está sendo executado é o seguinte:
sed -e 's/\/\//' ./file.dct
Você confirma que recebeu o mesmo erro ao executar este comando diretamente, por exemplo:
sed -e 's/\/\//' /tmp/dir1/mod/dir2/file.dct
Você também pode verificar isso executando echo
no comando find
, por exemplo:
find /tmp/dir1 -type f -path '*/mod/*.dct' -execdir echo "sed -e 's/\/\//' $(basename {})" \;
Para corrigir o comando, nós escapamos duas vezes das barras invertidas:
find . -type f -path '*/mod/*.dct' -execdir sh -c "sed -e 's/\\/\//' $(basename {})" \;
Isso produz o resultado desejado:
/