Intereting Posts
Centos 6.3 принудительно вводит пароль при нажатии кнопки nm-applet tray? Уровень громкости systemd с использованием символической ссылки устройства Как исправить неизвестную ошибку внутреннего сервера (500) Nginx дает мне? Как создать 32-битную систему chroot, которая является зеркалом моей текущей системы для целей компиляции? Медленная распечатка терминала Поиск файлов более поздним, чем один день, и копия Любая причина НЕ запускать Linux в виртуальной машине все время? снимать снимки объема BTRFS, смонтированного с помощью nodatacow? Взаимодействие со стеком ввода для исправления разрыва на сенсорном экране Является ли сервером Apache на личном сервере уязвимость безопасности? Сгруппировать каталог, но сохранить имена каталогов в новом имени файла Существуют ли различия между установкой файловой системы / proc в chroot по сравнению с монтированием ее снаружи? Проблемы с разделением файлов CSV Не удалось добавить eth0 в Rhel 7 нижняя граница скорости загрузки в wget

Используйте sed или awk для замены текста между столбцами

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

input1:input2:input3 aaa:bbb:ccc 111:222:333 

Я хотел бы, чтобы результат выглядел так:

 input1:new-text:input3 aaa:new-text:ccc 111:new-text:333 

Это может быть достигнуто с помощью sed, awk, cut или чего-либо, пока результат будет хорошим.

Учитывая правило «заменить второе поле, разделенное двоеточиями, new-text », awk делает это довольно просто:

 awk -F':' 'BEGIN { OFS=FS } {$2="new-text"; print} ' < input > output 

-F':' говорит awk использовать двоеточия для разделения полей в каждой строке.

Раздел BEGIN устанавливает в качестве разделителя выходного поля текущий разделитель полей (двоеточие), поэтому, когда мы перепечатаем строку позже, awk снова присоединяет поля вместе с двоеточиями.

Второй раздел не имеет условного выражения перед ним, поэтому он выполняется для каждой строки; он выполняет фактическую работу по замене второго поля new-text , а затем печатает новую строку.

если вам действительно нужен точно такой же текст для замены среднего fragmentа между единственной окружающей парой ‘:’ в каждой строке файла, тогда это работает

 sed -i -- "s|:.*:|:${mynewtext}:|" $inputfile 

шаблон. * просто означает один или несколько символов

Допустим, ваш текст находится в файле с именем code

 ]$cat code input1:input2:input3 aaa:bbb:ccc 111:222:333 

запустить эту команду

 ]$sed -e 's/:[^:]*:/:new-text:/' code input1:new-text:input3 aaa:new-text:ccc 111:new-text:333 

Чтобы взглянуть на это в общем виде и в режиме sed POSIX, где удаляемый столбец может быть предоставлен во время выполнения кода sed , а также новое содержимое столбца, подлежащего замене, вы можете сделать это:

 n=2; # the column number to be modified with a new value repl="new-text"; # the text used to replace the contents of the n-th col # to make the replacement sed friendly, otw, if it happened to have chars # which have a meaning to sed when using on the rhs of s/// command, we will # have an error on our hands. repl_esc=$(printf '%s\n' "$repl" | sed -e 's|[\&/]|\\&|g;$!s/$/\\/') sed -e ' s/.*/:&:/ '"s/:/\\n/$n;s//\\ /$n; s/\\n.*\\n/:${repl_esc}:/"' s/^:// s/:$// ' input-file.txt . n=2; # the column number to be modified with a new value repl="new-text"; # the text used to replace the contents of the n-th col # to make the replacement sed friendly, otw, if it happened to have chars # which have a meaning to sed when using on the rhs of s/// command, we will # have an error on our hands. repl_esc=$(printf '%s\n' "$repl" | sed -e 's|[\&/]|\\&|g;$!s/$/\\/') sed -e ' s/.*/:&:/ '"s/:/\\n/$n;s//\\ /$n; s/\\n.*\\n/:${repl_esc}:/"' s/^:// s/:$// ' input-file.txt