У меня есть текстовый файл с пробелом перед строкой. Как мне удалить его, используя tr
(или правильную команду)?
Например, у меня есть это:
Text
Мне бы хотелось:
Text
Но как мне это сделать для 200-строчного текстового файла?
У меня есть этот конвейер:
cat file.txt | tr -s " " | tr -d ","
Другие команды tr
предназначены для удаления других аспектов текстовые файлы.
Это должно сделать работу:
sed -e 's/^ //' -e 's/,//g' file.txt
Команде sed
(потоковый редактор) передаются две команды для последовательного выполнения, обе команды ничем не заменяют, то есть удаляют часть ввода.
Первый удаляет пробелы сразу после начала строки, отмечает ^
, второй удаляет запятые и имеет тот же эффект, что и ваша команда tr -d ","
.
Спасибо minerz029 за косвенное напоминание, что я пропустил «g», так как мой первый ответ удалял только первую запятую, найденную в каждой строке.
sed -e 's/^ //g' -e 's/,//g' file.txt
Объяснение:
Первый скрипт (s/^ //g
) должен заменить все начальные пробелы ничем (удалить).
Второй сценарий (s/,//g
) должен заменить все запятые ничем (удалить).
Bash имеет способ использовать структуру while IFS= read -r ; do . . . done < input.txt
для печати точного содержимого файла, но одна из особенностей здесь заключается в том, что если вы опустите IFS=
, начальные пробелы не будут читаться. Таким образом, мы можем сделать следующее:
$ cat input.txt
Text
$ while read -r line; do printf "%s\n" "$line"; done < input.txt
Text
И чтобы заменить текст исходного файла, можно немного изменить команду следующим образом:
$ cat input.txt
Text
$ while read -r line; do printf "%s\n" "$line"; done < input.txt > temp.txt ; mv temp.txt input.txt
$ cat input.txt
Text
Мы также можем использовать параметр расширение для удаления запятых
$ cat input.txt
Text, text,
$ while read -r line; do printf "%s\n" "${line//,}"; done < input.txt
Text text
tr -s" "
также может быть смоделировано путем незначительного изменения printf
$ cat input.txt
Text, text,
$ while read -r line; do printf "%s " ${line//,};printf "\n"; done < input.txt
Text text