it-swarm-eu.dev

find & sed (hledat a nahradit)

V mém počítači Mac používám následující příkaz:

$find . -name “*.Java” -exec sed -i ’s/foo/bar/g’ {} \;

a zdá se, že nemá žádný účinek.

Mám dva soubory v adresáři, které končí v .Java, které mají oba foo text v nich. Uniká mi něco?

ÚPRAVA: Výsledky z žádosti o připomínky

[aafghani-03:~/test amirafghani]$ find . -name "*.Java" -exec sed -i 's/foo/bar/g' {} \;
sed: 1: "./bar.Java": invalid command code .
sed: 1: "./foo.Java": invalid command code .
34
Amir Afghani

Nejprve se ujistěte, že používáte pravidelné ascii citace jako " A ' (Ascii kódy 0x22 A 0x27), Ve skriptech Shell, protože příklad ve vašem příspěvku obsahuje nestandardní citáty. Pokud se podíváte pozorně, vypadají trochu jinak. Nejpravděpodobnější je to chyba kopírování a vložení z formátu dokumentu RTF, jako je Word, OOWriter nebo dokonce z okna prohlížeče.

Protože jste na počítačích Mac, máte pravděpodobně implementaci FreeBSD sed, v takovém případě musíte příkaz napsat takto:

find . -name "*.Java" -exec sed -i '' s/foo/bar/g {} +

(zde použijte + místo \;, abyste zabránili spuštění jednoho sed vyvolání na soubor).

Při implementaci sed FreeBSD potřebuje příznak -i Argument: příponu záložního souboru. Například s -i .bak By příkaz zálohoval file1.txt Jako file1.txt.bak Před provedením nahrazení v původním souboru. Použití prázdného argumentu '' Znamená nepoužít záložní soubor, který se zdá být tím, co chcete.

Stejná věc při implementaci GNU (nebo NetBSD, OpenBSD, busybox) by byla:

find . -name "*.Java" -exec sed -i s/foo/bar/g {} +

Děkuji @ bahamat a @ Mikel a @ pieter-chov za vylepšení mé odpovědi pomocí vašich komentářů.

40
janos