Конкретная замена на уровне столбцов

Можно сделать что-то как этот путем добавления

\[\e[f\e[K\]

в начале Вашей быстрой переменной (PS1). Но это не принимает прокрутку во внимание.

\[      start non-printing sequence
\e[f    ANSI escape sequence to move cursor to position 1;1
\e[K    ANSI escape sequence to erase from cursor to end of line
\]      end of non-printing sequence
3
28.05.2015, 01:39
3 ответа

Вы можете сделать это за 2 шага с помощью awk типа

awk '{$2="VAL";print}' input_file > temp_file
mv temp_file input_file

Это разделит входной файл на белый, подставив значение во втором столбце (используйте любое другое число, кроме 2, для другого столбца), так что теперь это будет "VAL". Если вы не измените его с помощью OFS, разделителем полей на выходе будет пробел. Если вы хотите что-то другое, вы можете добавить внутри кавычек что-то вроде 'BEGIN {OFS="\t"}...', чтобы установить разделитель полей для вывода на все, что вы хотите.

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

Чтобы сделать эту работу для редактирования в вашем случае, вы можете сделать:

awk -F\| 'BEGIN {OFS="|";} $2~/^Orange$/ {$2="Orange_edit";} {print}' abc.txt > temp_file
mv temp_file abc.txt

Сначала это говорит awk о разделении полей на основе |, передавая -F\|. Затем мы настраиваем наш вывод на использование также | для разделителя вывода (по умолчанию это пробел), делая первый блок кода (часть, которая совпадает с BEGIN, ключевое слово в awk, которое совпадает с началом выполнения) и устанавливая наш OFS, или Разделитель полей вывода. Как указал Отеус, мы могли бы сделать {OFS=FS}, чтобы установить выходной разделитель таким же, как и входной.

После этого мы начинаем смотреть на строки. Сравниваем второе поле, на которое ссылается $2, затем проверяем, совпадает ли оно с регулярным выражением, используя ~. После того, как ~ будет регекс, с которым мы хотим сравнить, ^ здесь означает соответствие началу поля, затем у нас есть строка "Оранжевый", затем $, которая совпадает с концом поля. Так как это жестко закодированная строка Otheus также справедливо заметили, мы могли бы вместо этого проверить равенство строк здесь и сделать $2== "Orange" и пропустить обработку регексов, так как в этот раз на самом деле ничего не делает. Если это совпадение пройдет успешно, то блок кода в {} после его выполнения сохранит новое значение во втором поле.

Наконец, мы выполняем последний блок кода {печать} для каждой строки, но когда наше совпадение "Оранжевый" успешно завершилось выше, мы изменили значение второго поля, поэтому оно печатается с нашим новым значением, а не со старым.

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

4
27.01.2020, 21:11

Вы можете использовать perl:

$ perl -i.bak -F'\|' -aple 's/Orange/Orange_Edit/ if $F[1] eq "Orange"' file

или более безопасную версию:

$ perl -i.bak -F'\|' -aple '$F[1]=~s/^Orange$/Orange_Edit/; $_=join "|",@F' file
2
27.01.2020, 21:11

Есть много способов сделать это. Самыми простыми, вероятно, являются awk и perl:

  1. GNU gawk. Если у вас установлена относительно недавняя версия gawk, вы можете делать встроенное редактирование следующим образом:

    gawk -i inplace -F "|" -vOFS="|" '$2=="Orange"{$2="Orange_Edit"}1;' file 
    

    -i inplace сообщает gawk о необходимости редактирования файла, -F "|" устанавливает разделитель полей на |, а -vOFS="|" также устанавливает разделитель полей на |. Сценарий устанавливает второе поле ($2) в Orange_Edit только в том случае, если второе поле было Orange. Сокращение 1; является awk и предназначено для "распечатки текущей строки".

  2. Perl

    perl -i -F"\|" - полоса '$F[1]="Orange_Edit" если $F[1] eq "Orange"; 
     распечатать присоединяйся к файлу "|",@F'. 
    

    -a заставляет Perl действовать как awk и разбивать строки на значение, заданное -F, сохраняя результирующие поля в массиве @F. Затем скрипт устанавливает второе поле ($F[1], массивы начинаются с 0) в Orange_Edit, если его первоначальное значение было Orange. Затем к полям присоединяется | и распечатывается.

  3. Если вы просто хотите изменить первое вхождение Orange, вы можете упростить и использовать

    sed -i файл 's/Orange/Orange_Edit/'. 
    

    Вы могли бы сделать это немного более надежным, согласовав только целые поля:

    sed -i 's/|Orange|/|Orange__Edit|/' файл. 
    Реализации 
2
27.01.2020, 21:11

Теги

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