Я имею текстовый файл с неожиданными пробелами вначале и хотел бы обрезать начало и сохранить его. Как я могу сделать это?
Я попробовал очень простой пример, который я нашел в Интернете, но он стирает файл вместо этого:
cat /etc/nginx/sites-enabled/default| sed -e 's/^[ \t]*//' > /etc/nginx/sites-enabled/default
Это:
cat /etc/nginx/sites-enabled/default| sed -e 's/^[ \t]*//' > /etc/nginx/sites-enabled/default
усекает файл, потому что перенаправление >
разрешается первым; то есть файл усекается до запуска cat
и sed
(а cat
читает пустой файл).
Также команда удаляет начальные пробелы и табуляции .
Если это то, что вы хотите, просто используйте опцию на месте sed
(и отбросьте бесполезные cat
):
sed -ie 's/^[ \t]*//' /etc/nginx/sites-enabled/default
Если вы хотите удалить только начальные пробелы, используйте эту вместо этого:
sed -ie 's/^ *//' /etc/nginx/sites-enabled/default
Также похоже, что вы хотите обработать только первую строку.
Если это так, добавьте 1
к команде s
; то есть :
sed -ie '1s/^[ \t]*//' /etc/nginx/sites-enabled/default
для удаления первых пробелов и табуляций из первой строки и
sed -ie '1s/^ *//' /etc/nginx/sites-enabled/default
для удаления только первых пробелов из первой строки.
Используйте это вместо:
cat 1.txt | sed 's/^ *//;s/ *$//' | sed '/^$/d' > 2.txt
cat 1.txt
- загружает содержимое файла как ввод sed 's/^ *//;s/ *$//'
- удаляет пустые места из обе стороны файла. Начало или трейлинг. sed '/^$/d'
- удаляет пустые строки (в случае, если вышла указанная выше команда) > 2.txt
- сохраняет результат в новый файл. Если вы не хотите удалять пустые строки, пропустите третий шаг. В этом случае ваша команда становится такой:
cat 1.txt | sed 's/^ *//;s/ *$//' > 2.txt
Вводимый текст (как изображение, точки показывают пробелы):
Вывод текста (в виде изображения, без точек и удаленных пустых строк):
Приведенное выше объяснение очищает файл, если перенаправлен на себя, как показано ниже:
cat 1.txt | sed 's/^ *//;s/ *$//' | sed '/^$/d' > 1.txt
Чтобы обработать это и убедиться, что содержимое перезаписано в файл, нам просто нужно вывести вывод как в команде ниже:
echo | cat 1.txt | sed 's/^ *//;s/ *$//' | sed '/^$/d' > 1.txt
Вы также можете использовать Python (как Python 2, так и Python 3) для задания:
python -c 'import sys; print("".join((str(line).lstrip(" ") for line in sys.stdin)))' <INPUTFILE >OUTPUTFILE
Что делает эта команда:
python -c '...'
или python3 -c '...'
: import sys; print("".join((str(line).lstrip(" ") for line in sys.stdin)))
: <INPUTFILE
: INPUTFILE
(замените соответствующим именем файла) с STDIN команды. Если вы пропустите это, команда будет читать с клавиатуры. >OUTPUTFILE
: OUTPUTFILE
(замените соответствующим именем файла) с STDOUT команды. Если вы пропустите это, команда выведет свои выходные данные на терминал. Обратите внимание, что в этом случае INPUTFILE
и OUTPUTFILE
могут не совпадать с файлами, так как используемое перенаправление вывода Bash разрешается первым и перезаписывает файл перед чтением из него скриптом. [ 1120]
Можно использовать Vim в режиме Ex:
ex -sc '%s/^[ \t]*//|x' /etc/nginx/sites-enabled/default
%
выбор все строки
s
замена
x
сохраняет и закрывается