Naprawdę nie powinieneś używać sed do tego. Wydaje się, że to pytanie wydaje się często absurdalnie często i wydaje się bardzo dziwne, że tak, ponieważ ogólne rozwiązanie jest tak banalne, wydaje się dziwne, że ludzie chcą wiedzieć, jak to zrobić w sed, w python, w rubinach itd. . Jeśli chcesz mieć filtr działać na wejściu i zastąpić go, kliknąć na poniższy prosty skrypt:
#!/bin/sh -e
in=${1?No input file specified}
mv $in ${bak=.$in.bak}
shift
"[email protected]" < $bak > $in
umieścić, że na swojej drodze w nazwa pliku wykonywalnego inline
, a następnie problem jest rozwiązany w ogóle. Na przykład:
inline input-file sed -e s/foo/bar/g
Teraz, jeśli chcesz dodać logikę do przechowywania wielu kopii zapasowych, lub jeśli masz kilka opcji, aby zmienić schemat nazewnictwa kopii zapasowej, czy cokolwiek, to naprawić w jednym miejscu. Jaka jest opcja wiersza poleceń, aby uzyskać liczniki jednopozycyjne w pliku kopii zapasowej podczas przetwarzania pliku na miejscu przy użyciu perl
? A co z numerem ruby
? Czy ta opcja jest inna w przypadku gnu-sed
? Jak radzi sobie z tym awk
? Cały friggin 'point of unix jest taki, że narzędzia robią tylko jedno. Obsługa logiki dla plików kopii zapasowych jest drugą kwestią i należy ją rozważyć. Jeśli wdrażasz narzędzie, nie dodawaj logiki do tworzenia plików kopii zapasowych. Poinformuj użytkowników o użyciu drugiego narzędzia. Integracja jest zła. Modułowość jest dobra. To jest sposób uniksowy.
Należy zauważyć, że ten skrypt ma kilka problemów.Uprawnienia/tryb pliku wejściowego mogą na przykład zostać zmienione. Jestem pewien, że są niezliczone inne problemy. Jednak umieszczając logikę kopii zapasowej w skrypcie otoki, lokalizujesz wszystkie te problemy i nie musisz się martwić, że sed
nadpisuje tryb plików i zmian, podczas gdy python
utrzymuje plik na miejscu i nie zmienia i-węzła (zrobiłem się tych dwóch przypadkach, punkt jest, że nie wszystkie narzędzia będą używać tej samej logiki, natomiast skrypt wrapper będzie.)
sed -es/Some1/some2/g input.file> output.file mv output.file input.file – 0xAX