Linux убрать последний символ

Как я могу удалить последний символ файла в unix?

Скажем, у меня есть произвольный многострочный текстовый файл:

Как я могу удалить только последний символ (e, а не новую строку или ноль) файла, не делая текстовый файл недействительным?

7 ответов

sed ‘s/.$//’ filename | tee newFilename

Это должно сделать вашу работу.

РЕДАКТИРОВАНИЕ ОТВЕТА

Я создал сценарий и поместил ваш текст на свой рабочий стол. этот тестовый файл сохраняется как «old_file.txt»

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

Открытие созданного мной new_file показало следующий результат:

Прошу прощения за свой предыдущий ответ (не читал внимательно)

Замечание: sed временно удалит файл. Поэтому, если вы следите за файлом, вы будете получать предупреждение «Нет такого файла или каталога», пока не повторно введете команду tail.

Если цель состоит в том, чтобы удалить последний символ в последней строке, этот awk должен делать:

Он сохраняет все данные в массиве, затем распечатывает его и изменяет последнюю строку.

После целой кучи экспериментов с разными стратегиями (и избегания sed -i или perl) лучший способ, который я нашел для этого, заключался в следующем:

Вот еще одно использование ex , которое я считаю не таким загадочным, как решение sed:

$ переходит к последней строке, s удаляет последний символ, а wq — это хорошо известная (для пользователей vi) запись + выход.

truncate

Удаляет один (-1) символ из конца того же файла. Точно так же, как >> будет добавляться к тому же файлу.

Проблема с этим подходом заключается в том, что он не сохраняет завершающую новую строку, если она существует.

Это работает, потому что tail занимает последний байт (не char).

Это почти не занимает времени даже с большими файлами.

Почему бы и нет sed

Проблема с решениями sed, такими как sed ‘$ s/.$//’ file , заключается в том, что они сначала читают весь файл (что занимает много времени с большими файлами), а затем вам нужен временный файл (того же размера, что и оригинал):

Затем переместите временный файл, чтобы заменить файл.

Источник

Удалить последний символ строки, используя строковые манипуляции в сценарии оболочки

Я хотел бы удалить последний символ строки, я попробовал этот маленький скрипт:

но он печатает «lkj», что я делаю не так?

В оболочке POSIX синтаксис $ означает что-то другое — он расширяется до значения t if t , установленного и отличного от NULL, а в противном случае до значения 2 . Чтобы обрезать один символ с помощью раскрытия параметров, вы, вероятно, захотите следующий синтаксис: $

Обратите внимание , что в ksh93 , bash или zsh , $ или $ (обратите внимание на пробел) являются законными как расширение подстроки , но, вероятно , не то , что вы хотите, так как они возвращают подстроки , начиная с позицией 2 символа в с конца (т.е. удаляет первый символ i из строка ijk ).

См. Раздел «Расширение параметров оболочки» Справочного руководства Bash для получения дополнительной информации:

С bash 4.2 и выше, вы можете сделать:

Обратите внимание, что для более старых версий bash (например, bash 3.2.5 в OS X) вы должны оставлять пробелы между двоеточиями и после них:

Читайте также:  Переводчик для linux ubuntu

для удаления последних n символов из строки, которая не использует sed ИЛИ awk :

так, например, вы можете удалить последний символ, one character используя это:

ОПИСАНИЕ
Утилита rev копирует указанные файлы в стандартный вывод, меняя порядок символов в каждой строке. Если файлы не указаны, читается стандартный ввод.

если вы не знаете длину строки, попробуйте:

С помощью sed это должно быть так же быстро, как

Ваше единственное эхо тогда echo ljk | sed ‘s/.$//’ .
Используя это, строка из 1 строки может быть любого размера.

Несколько вариантов в зависимости от оболочки:

  • POSIX: t=$
  • Bourne: t=`expr » $t» : ‘ \(.*\).’`
  • ЗШ / йаш: t=$
  • Баш / ЗШ: t=$
  • ksh93 / Баш / ЗШ / МКШ: t=$-1>
  • ksh93 / Баш / ЗШ / МКШ: t=$
  • ksh93: t=$

Обратите внимание, что хотя все должны удалять последний символ , вы обнаружите, что некоторые реализации (те, которые не поддерживают многобайтовые символы) вместо этого отбрасывают последний байт (так что, вероятно, испортил бы последний символ, если он был многобайтовым). ).

Предполагается, что expr вариант $t не заканчивается более чем одним символом новой строки. Он также вернет ненулевой статус выхода, если полученная строка окажется 0 ( 000 или даже -0 с некоторыми реализациями). Это также может дать неожиданные результаты, если строка содержит недопустимые символы.

Самый портативный и самый короткий ответ почти наверняка:

Это работает в bash, sh, ash, dash, busybox / ash, zsh, ksh и т. Д.

Он работает с использованием расширения параметров старой школы. В частности, % указывается, чтобы удалить наименьший соответствующий суффикс соответствия параметра, t который соответствует шаблону глобуса ? (т. Е. Любому символу).

См. «Удалить самый маленький шаблон суффикса» здесь для более подробного объяснения и дополнительной информации. Также см. Документы для вашей оболочки (например:) в man bash разделе «Расширение параметров».

В качестве примечания: если вы хотите вместо этого удалить первый символ, вы должны использовать $ , так как # совпадения начинаются с начала строки (префикс), а не с конца (суффикс).

Также стоит отметить, что как % и , так и # иметь %% и ## версии, которые соответствуют самой длинной версии данного шаблона, а не самой короткой. Оба $ и $ будут делать то же самое, что и их единственный оператор в этом случае (так что не добавляйте лишний лишний символ). Это потому, что данный ? шаблон соответствует только одному символу. Смешайте * с некоторыми не подстановочными знаками, и все становится более интересным с %% и ## .

Понимание расширений параметров или, по крайней мере, знание об их существовании и умение их искать, невероятно полезно для написания и расшифровки сценариев оболочки многих разновидностей. Расширения параметров часто выглядят как тайная оболочка вуду для многих людей, потому что . ну . они являются тайной оболочкой вуду (хотя довольно хорошо документированы, если вы знаете, что нужно искать «расширение параметров»). Определенно хорошо иметь в поясе инструментов, когда вы застряли в оболочке.

Источник

Как я могу удалить последний символ файла в Unix?

Скажем, у меня есть произвольный многострочный текстовый файл:

Как я могу удалить только последний символ (e, а не символ новой строки или ноль) файла, не делая текстовый файл недействительным?

Более простой подход (выводит в stdout, не обновляет входной файл):

  • $ — это адрес Sed, который соответствует только последней строке ввода, поэтому следующий вызов функции ( s/.$// ) будет выполняться только в последней строке.
  • s/.$// заменяет последний символ в строке (в данном случае last) пустой строкой; т.е. эффективно удаляет последний символ. (до новой строки) на строке.
    . сопоставляет любой символ в строке, а после него $ привязывает совпадение к концу строки; обратите внимание, что использование $ в этом регулярном выражении концептуально связано, но технически отличается от предыдущего использования $ в качестве Sed address.

Пример с вводом stdin (предполагает Bash, Ksh или Zsh):

Для обновления входного файла тоже (не используйте, если входной файл является символической ссылкой):

Замечания:
* В OSX вам придется использовать -i » вместо просто -i ; для обзора ловушек, связанных с -i , смотрите нижнюю половину мой ответ здесь .
* Если вам нужно обрабатывать очень большие входные файлы и/или производительность/использование диска вызывает озабоченность и вы используете утилиты GNU (Linux), см. полезный ответ sorontar .

truncate

Удаляет один (-1) символ из конца того же файла. Точно так же, как >> добавит к тому же файлу.

Проблема с этим подходом состоит в том, что он не сохраняет завершающий символ новой строки, если он существует.

Это работает, потому что tail занимает последний байт (не char).

Это занимает почти нет времени даже с большими файлами.

Почему бы не sed

Проблема с решением sed, таким как sed ‘$ s/.$//’ file , заключается в том, что сначала он читает весь файл (что занимает много времени с большими файлами), затем вам нужен временный файл (того же размера, что и оригинал):

А затем переместите временный файл для замены файла.

Вот еще один пример использования ex , который я считаю не таким загадочным, как решение sed:

$ идет до последней строки, s удаляет последний символ, а wq — это хорошо известная (для пользователей vi) запись + выход.

Если цель состоит в том, чтобы удалить последний символ в последней строке, эта awk должна сделать:

Он сохраняет все данные в массив, затем распечатывает их и изменяет последнюю строку.

Просто замечание: sed временно удалит файл . Поэтому, если вы настраиваете файл, вы получите предупреждение «Нет такого файла или каталога», пока вы не повторите команду tail.

Отредактированный ответ

Я создал скрипт и разместил ваш текст внутри на рабочем столе. этот тестовый файл сохраняется как «old_file.txt»

После этого я написал небольшой скрипт, чтобы взять старый файл и удалить последний символ в последней строке

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

Я прошу прощения за мой предыдущий ответ (не читал внимательно)

После целого ряда игр с разными стратегиями (и избегая sed -i или Perl), лучший способ, который я нашел для этого, был с:

Источник

Как удалить последний символ из вывода bash grep

выводит что-то вроде этого

что я хочу сделать, так это удалить трейлинг»;». Как я могу это сделать? Я новичок в bash. Любые мысли или предложения были бы полезны.

14 ответов

Я хотел бы использовать sed ‘s/;$//’ . например:

это удалит последний символ, содержащийся в вашем COMPANY_NAME var, независимо от того, является ли он точкой с запятой:

Я хотел бы использовать head —bytes -1 или head -c-1 для краткости.

head выводит только начало потока или файла. Обычно он подсчитывает строки, но вместо этого его можно сделать для подсчета символов/байтов. head —bytes 10 выводит первые десять символов, но head —bytes -10 выведет все, кроме последних десяти.

Примечание: Вы можете иметь проблемы, если последним символом является многобайтовой, но запятой не

Я бы рекомендовал это решение sed или cut потому что

  • это точно head был разработан, чтобы сделать, таким образом, меньше параметров командной строки и проще для чтения команды
  • это избавляет вас от необходимости думать о регулярных выражениях, что это круто/мощный, но часто перебор
  • это экономит вашу машину, чтобы думать о регулярных выражениях, так что будет незаметно быстрее

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

но я не смог вставить часть grep в фигурные скобки, поэтому ваша конкретная задача становится двухстрочной:

это очистит любой символ, точку с запятой или нет,но может избавиться от точки с запятой специально. Чтобы удалить все точки с запятой, куда бы они ни падали:

удалить только точку с запятой в конец:

или, чтобы удалить несколько точек с запятой в конце:

для большей детализации и больше на этом подходе, проект документации Linux охватывает много земли на http://tldp.org/LDP/abs/html/string-manipulation.html

используя sed , Если вы не знаете, какой последний символ на самом деле:

не злоупотребляйте cat s. Вы знали, что grep может читать файлы, тоже?

канонический подход будет следующим:

более умный подход будет использовать один perl или awk оператор, который может выполнять фильтрацию и различные преобразования сразу. Например что-то вроде этого:

Не нужно связывать так много инструментов. Только одна команда awk делает работу

Источник

🐹 Bash: Удаление первых и последних символов из строк в bash.

Опубликовано 2021-05-18 · Обновлено 2021-05-24

Содержание:

1. Задача.

Бывает, что требуется удалить несколько символы в начале каждой строки в файлах, чтобы подогнать вывод информации под тот же *.json с помощью bash-скрипта. Можно напечатать часть строки между заданными первым и последним символами, используя команду cut или удалить последние символы в конце каждой строки с помощью хитрости и команды reverse .

2. Решение задачи.

2.1. Файл с примером текста.

Предварительно создадим файл со следующим содержимым и будем использовать его в примерах ниже.

Ответ:

Допустим нам необходимо удалить несколько символов с начала и с конца каждой строки этого файла.

2.2. Удалить первые N символов с начала каждой строки.

Используйте следующую команду чтобы удалить первые 5 символов каждой строки, то есть удаляем первые 5 символов и печатаем каждую строку, начиная с 6-ого символа:

# cat file.txt | cut -c 6-

Ответ:

2.3. Печать строки между заданными символами.

Используйте следующую команду чтобы напечатать содержимое каждой строки между 9-ым и 20-ым символами в bash-скрипте:

# cat file.txt | cut -c 9-20

Ответ:

2.4. Печать первых N символов каждой строки.

Используйте следующую команду чтобы напечатать первые 20 символов каждой строки в bash-скрипте:

# cat file.txt | cut -c 1-20

Ответ:

2.5. Удалить крайний символ каждой строки.

Используя сочетание команд reverse и cut , мы можем удалять последние N символов каждой строки, как показано ниже.

Используйте следующую команду чтобы удалить последний символ каждой строки в bash-скрипте:

# rev file.txt | cut -c 2- | rev

Ответ:

2.6. Удалить крайние N символов каждой строки.

Используйте следующую команду чтобы удалить последние 8 символов каждой строки в bash-скрипте:

# rev file.txt | cut -c 9- | rev

Ответ:

2.7. Удалить первый и крайний 1 символ с каждой стороны строки.

Используйте следующую команду чтобы удалить самый первый и самый крайний символ из всех строк файла:

Ответ:

Ответ:

2.8. Удалить первые и крайние 8 символов с каждой стороны строки.

Используйте следующую команду чтобы удалить первые 8 символов и 8 крайних символов из всех строк файла:

Источник

Читайте также:  Запуск линукс с внешнего жесткого диска
Оцените статью