fd9750 Ответов: 2

Как заменить строку специальных символов в файле с помощью (ubuntu) bash


Всем Привет,

У меня есть много проблем, чтобы сделать что-то, что я думаю, должно быть тривиальным, но я не могу найти правильное решение.

Проблема заключается в следующем: у меня есть текстовый файл csv ( без какого-либо контроля над содержимым ) с некоторыми строками в нем, которые заканчиваются словами "\t\t\r\n" тогда как они должны заканчиваться словами "\r\n" вместо. Дополнительные символы '\t' вызывают проблемы при попытке импортировать текстовый файл в MySQL.

Я думал СЭД я мог бы позаботиться об этом, но не нашел ничего, что действительно работает. Многочасовое гугление тоже не помогло.

Любая помощь/предложение будут очень признательны.

Что я уже пробовал:

Я зашел достаточно далеко, чтобы найти способ объявить две строки следующим образом:

mytest=$'\t\t\r\n'
mytest=$'\r\n'

Когда я Эхо эти строки в файл следующим образом:

echo "mytest"+"mytest2" > bin.txt

Я понимаю, что bin.txt файл и, конечно же, он имеет ожидаемое содержимое. ( "\t\t\r\n+\r\n" ).

То, что я не могу найти до сих пор, это получить СЭД команда для правильного использования строк для замены вхождения mytest содержимым mytest2 в файле.

2 Ответов

Рейтинг:
6

fd9750

#!/usr/bin/python
# replace.py
import sys

# Replace string in a file (in place)
match=b'\t\t\r\n'
replace=b'\r\n'
filename='MyTestFile.txt'

print ("Replacing strings in",filename)

with open(filename,"rb") as f:
  data = f.read().replace(match,replace)

with open(filename,"wb") as f:
  f.write(data)

Хитрость заключается в том, чтобы открыть файл как двоичный файл, указать двоичное совпадение и заменить строки и записать файл обратно в двоичный файл: работает как заклинание.


Рейтинг:
19

Richard MacCutchan

Попробуйте что-нибудь вроде:

cat sourcefile | sed 's/\t//g' > destfile

Это должно заменить каждое появление "\t" ничем, эффективно удаляя их.


k5054

Не знаю, зачем вам это нужно cat когда sed умеет читать из файла

sed -e 's/\t//g' sourcefile > destfile

Вы также можете сделать это на месте:
sed -i -e 's/\t//g' sourcefile

fd9750

Привет,
Я пробовал бесчисленные варианты этого, но это никогда не удавалось.
Тем временем я нашел способ сделать это с помощью скрипта python.

Richard MacCutchan

Я попробовал это с моим предложением, и это сработало отлично.

k5054

у меня тоже получается ... Может быть, op на самом деле имеет'\', за которым следует 't' для замены, а не вкладки?

Richard MacCutchan

Я тоже об этом подумал.

Richard MacCutchan

Главным образом потому, что я не мог вспомнить все варианты sed, и не мог потрудиться посмотреть их.