Używam Linuksa. Gdzieś ukryty w tysiącach plików konfiguracyjnych jest nieznośny ^ M (Windows cariage return) i muszę go znaleźć, ponieważ powoduje to awarię serwera.
Jak znaleźć ^ M wśród hierarchii katalogów pełnej plików konfiguracyjnych?
Myślę, że nie mogę wpisać ^ M w linii poleceń bash. Ale mam go w pliku tekstowym, który nazwałem m.txt
Odpowiedzi:
Użyj
-r
do wyszukiwania rekurencyjnego i$''
ucieczki w stylu c w Bash.Ponadto, jeśli masz pewność, że jest to plik tekstowy, uruchomienie powinno być bezpieczne
aby usunąć wszystko
\r
z pliku.Jeśli używasz GNU
sed
,-i
możesz przeprowadzić edycję w miejscu, więc nie będziesz musiał odpisywać:źródło
$'\r'
.$'
przeczytania pierwszego trafienia na stronie podręcznikabash(1)
, w zasadzie widać to tak, jakbyś pisał literał C. Jeśli chodzi ocommand < filename
korzystanie z<
lub>
nazywa przekierowanie , to pierwszy raz widziałem ktoś nazwał go większa ekspresja . SzukajREDIRECTION
wbash(1)
.Kiedy próbowałem, mogłem stwierdzić, że to trochę działa, ale linie drukowały się puste. Dodaj w opcji:
Jeśli dostaniesz ten problem, myślę, że to znaki ucieczki dla podświetlania kolorów przeszkadzają
\r
postaci.źródło
Jeśli twój serwer nie ma powłoki bash, alternatywą jest użycie tej
-f
opcjigrep
w połączeniu z przygotowanym plikiem zawierającym\r
.Aby utworzyć plik:
Aby przeprowadzić wyszukiwanie
lub możesz być trochę leniwy i po prostu wpisz *,
Opcja na jest używany do określenia pliku, który zawiera wzory wszystkich, po jednym w wierszu. W tym przypadku jest tylko jeden wzór.
-f filename
grep
źródło
Jeśli dobrze rozumiem twoje pytanie, tak naprawdę chcesz znormalizować wszystkie zakończenia linii do standardu Unix LF (
\x0a
). To nie to samo, co zwykłe usuwanie CRs (\x0d
).Jeśli zdarzy ci się mieć jakieś pliki Mac, w których używa się tylko CR dla nowych linii, zniszczysz te pliki. (Tak, komputery Mac powinny używać LF od prawie 20 lat, ale wciąż istnieje (w 2019 r.) Wiele aplikacji na komputery Mac, które używają tylko CR).
Możesz użyć
\R
klawisza Escape w Perlu, aby zastąpić dowolny rodzaj nowej linii\n
.Spowodowałoby to zastąpienie w miejscu wszelkiego rodzaju podziałów liniowych na
\n
in$your_file
, utrzymując kopię zapasową oryginalnego pliku w${your_file}.bak
.źródło
Aby użyć grep na znakach końca linii, myślę, że musisz powiedzieć grep, że plik jest binarny.
-l (litera L) służy do drukowania tylko nazwy pliku
-P jest dla wyrażenia regularnego perla (więc \ x0d jest transformowane do \ r lub ^ M)
źródło
Jeśli korzystasz z komputera Mac i używasz homebrew , możesz:
aby usunąć wszystkie zwroty karetki Windows z pliku.txt
Aby wrócić do powrotu karetki systemu Windows,
źródło
W stylu wyrażeń regularnych różne znaki nowej linii:
Windows (CR LF)
\r\n
Unix (LF)
\n
Ponieważ
\r\n
sekwencja jest dość wyjątkowa, myślę, że powinieneś być w stanie jej szukać w ten sposób?Co gorsza, komputery Mac miały po prostu „\ r” zamiast nowej linii. Nie mogę tego zweryfikować, ale nie sądzę, że generacje MacOSX już to robią.
Starsze komputery Mac (CR)
\r
źródło
grep "\r\n" *
nie daje żadnego wyniku. Brak wyników dlaegrep -e "\r\n" *
norgrep -E "\r\n" *
\r
mój zły. Pełna linia nowego systemu to rzeczywiście\r\n
CRLFZgodnie z poprzednimi odpowiedziami metoda „tr” jest dobra:
533 $ if [[-n "
tr -cd "\r" <~/.bashrc
"]]; następnie powtórz „DOS”; w przeciwnym razie echo „UNIX”; fiUNIX
534 $ if [[-n "
tr -cd "\r" <dosfile.txt
"]]; następnie powtórz „DOS”; w przeciwnym razie echo „UNIX”; fiDOS
źródło