удалить слово из многих мест в длинном текстовом файле

Общие сведения

Я тестировал решение в Fedora 21 с GNOME Shell 3.14.4, но считаю, что его можно применить и к другим версиям.

Прежде всего необходимо понять, что среда рабочего стола GNOME переопределяет общесистемные определения локали и, таким образом, на нее не влияет /etc/locale.conf . Кроме того, могут быть приложения, у которых есть собственная конфигурация локали и которые вообще не используют настройки системы или GNOME. В этом руководстве я опишу способ настройки параметров локали в соответствии с вашими потребностями и GNOME, и система будет согласована с точки зрения локали.


Проверка текущего статуса языкового стандарта

Общесистемные настройки

Из Руководство системного администратора Fedora 21 :

Общесистемные настройки языкового стандарта хранятся в / etc / locale. conf , который читается при ранней загрузке демоном systemd . Настройки локали, сконфигурированные в /etc/locale.conf , наследуются каждой службой или пользователем, если отдельные программы или отдельные пользователи не переопределяют их.

Чтобы увидеть текущий статус локали, мы можем запустить:

$ localectl status
   System Locale: LANG=en_US.UTF-8
                  LC_NUMERIC=en_US.UTF-8
                  LC_TIME=en_US.UTF-8
                  LC_MONETARY=en_US.UTF-8
                  LC_PAPER=en_US.UTF-8
                  LC_MEASUREMENT=en_US.UTF-8
       VC Keymap: us
      X11 Layout: us

Настройки GNOME

$ gsettings get org.gnome.system.locale region
'en_US.UTF-8'

GNOME имеет только одну настройку. Беглый взгляд на исходный код gnome-control-center кажется, что когда вызывается функция set_localed_locale () , она устанавливает все следующие категории (LC_TIME, LC_NUMERIC, LC_MONETARY, LC_MEASUREMENT, LC_PAPER) в один и тот же языковой стандарт, определенный в org.gnome.system.locale region .

Смешивание различных настроек локали кажется невозможным без создания собственной локали, но, к счастью, это не очень сложная задача.


Создание пользовательского языкового стандарта

Я думаю, что проще всего объяснить это на примере. В моем конкретном случае я хотел иметь собственный языковой стандарт, в основном на основе иврита ( he_IL ), но с LC_NAME, LC_MESSAGES из en_US и LC_TIME (с измененным first_weekday и first_workday ) из en_GB .

Получение файлов определения локали

Вы должны иметь представление о том, какие языковые стандарты вы хотите смешать. Сначала нам нужно найти соответствующие файлы определений, которые можно найти в / usr / share / i18n / locales / . Вернемся к моему примеру, мне понадобилось следующее: he_IL , en_US и en_GB . Я создал рабочую папку у себя дома и скопировал в нее необходимые файлы:

$ cd /usr/share/i18n/locales
$ mkdir -v ~/custom-locale ; cp -v he_IL en_US en_GB ~/custom-locale/

Создание нового файла определения

Я решил назвать свой языковой стандарт hc_IL и взял he_IL в качестве основы. Следующие строки создают новый файл hc_IL с содержимым из he_IL и по ходу заменяют все вхождения строки he_IL внутри файла на hc_IL .

$ cd ~/custom-locale/
$ sed 's/he_IL/hc_IL/g' he_IL > hc_IL

Изменение нового файла определения

Теперь мы можем настроить новый языковой стандарт в соответствии с нашими потребностями. Откройте только что созданный файл ~ / custom-locale / hc_IL в вашем любимом текстовом редакторе.Я использую vim (он имеет правильную подсветку синтаксиса для файлов определения локали):

$ vim ~/custom-locale/hc_IL

Для тех, кто еще не выбрал свой любимый редактор, а vim - не их чашка чая, можно использовать gedit :)

$ gedit ~/custom-locale/hc_IL

Структура файла не очень сложная. По сути, он состоит из разделов. Из locale (5) страниц руководства:

Определение языкового стандарта имеет по одной части для каждой категории языкового стандарта. Каждую часть можно скопировать из другого существующего языкового стандарта или определить с нуля . Если категория должна быть скопирована, единственным допустимым ключевым словом в определении является копия , за которым следует имя локали, которую следует скопировать.

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

LC_MESSAGES
copy "en_US"
END LC_MESSAGES

Полную документацию по файлу определения локали можно получить через:

$ man 5 locale

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

В моем случае я изменил следующие категории и ключевые слова:

  • LC_IDENTIFICATION

     title «Пользовательский языковой стандарт иврита» 
    источник «mydomain.ws» 
    адрес «http: /// /www.mydomain.ws"
    contact "" 
    электронная почта (скрытая) 
    tel "" 
    fax "" 
    language "Hebrew" { {1}} территория "Израиль" 
    редакция "1.0" 
    дата "2015-04-21" 
     

    Примечание: Все категории " .. "строки в разделе LC_IDENTIFICATION были изменены во время создания файла с помощью sed . Так что нам больше не нужно их трогать.

  • LC_TIME

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

     first_weekday 1 
    first_workday 1 
     
  • Остальные категории я оставил как есть или заменил их содержание директивой copy , как в:

     LC_NAME 
    copy "en_US" 
    END LC_NAME 
     

Вот и все, файл определения готов. Не забудьте сохранить файл :)

Компиляция и копирование новой локали

Компиляция новой локали выполняется с помощью следующей команды как root или с помощью sudo . Замените hc_IL своей локалью:

$ sudo localedef  -c -v -i hc_IL -f UTF-8 hc_IL.UTF-8

Если компиляция прошла успешно, скомпилированные данные локали добавляются в архивный файл / usr / lib / locale / locale-archive .

Скопируйте новый файл определения локали в каталог определений локали. Замените hc_IL своей локалью:

$ sudo cp -v hc_IL /usr/share/i18n/locales/

Активация новой локали

На этом этапе мы хотим настроить систему и GNOME для использования новой локали.

Общесистемные настройки

Отредактируйте файл /etc/locale.conf как root и установите каждую строку, начинающуюся с LC_ , на свой новый локаль. Например:

LANG=en_US.UTF-8
LC_NUMERIC=hc_IL.utf8
LC_TIME=hc_IL.utf8
LC_MONETARY=hc_IL.utf8
LC_PAPER=hc_IL.utf8
LC_MEASUREMENT=hc_IL.utf8

Настройки GNOME

Чтобы активировать новую локаль в GNOME, выполните следующую команду. Замените hc_IL своей локалью:

$ gsettings set org.gnome.system.locale region "hc_IL.utf8"

Проверка новых настроек

Последний шаг - убедиться, что все работает должным образом. Для перезагрузки всех настроек мне проще всего было перезагрузить компьютер.

  • Обратитесь к разделу «Проверка текущего состояния локали», чтобы проверить правильность конфигурации системы.
  • Используйте оболочку GNOME и приложения, зависящие от языкового стандарта (графические и консольные), и убедитесь, что они ведут себя должным образом с новым языковым стандартом. Например.если вы настроили LC_TIME, вы можете запустить команду date для проверки формата даты:

     $ date +% x 
    21/04/15 
     

Примечание: Все было протестировано на Fedora 21 с GNOME 3.14. Для других дистрибутивов Linux могут потребоваться дополнительные или другие шаги.

Прокомментируйте, если вы обнаружите какие-либо проблемы с инструкциями.

0
05.03.2018, 17:36
2 ответа

La respuesta de Gilles funciona, pero solo eliminará namede la salida estándar. Si desea eliminar namedel archivo en sí, necesita:

sed -i 's/name//' file

1
28.01.2020, 02:16

¿Por qué no simplemente:

sed 's/name//' file

?

4
28.01.2020, 02:16

Теги

Похожие вопросы