Не заменяйте второе вхождение шаблона в том же слове в файле командой sed

awk '
    NR == 1 {print}
    FNR == 1 {next}
    {print}
' *.csv

Переменная NR - это номер записи всего ввода.
Переменная FNR - это номер записи только для текущего файла.

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

0
21.06.2018, 18:47
3 ответа

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

$ echo 'aa' | sed 's/a/b/g'
bb
$ echo 'aa' | sed 's/a/b/'
ba

Параметр gозначает «глобальный», который явно указывает sedзаменить все совпадения, а не только первое (, что является поведением по умолчанию ).

3
28.01.2020, 02:18

gв конце заставит sedповторить подстановку столько раз, сколько возможно в строке. Вы только хотите сделать это дважды.

Давайте сделаем это с помощью GNUawk:

echo 'abcdef12cade 12345678 abcdefba12345678' |
awk '{ sub("[0-9a-fA-F]{8}", "00000000", $1)
       sub("[0-9a-fA-F]{8}", "00000000", $2)
       print }'

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

0
28.01.2020, 02:18

Похоже, вы ищете слова длиной от 8 до 15 символов и заменяете первые 8 шестнадцатеричных цифр:

sed -E 's/\<[[:xdigit:]]{8}([[:xdigit:]]{0,7})\>/00000000\1/g' <<END
abcdef12cade 12345678 abcdefba12345678 12345 123456789
END
00000000cade 00000000 abcdefba12345678 12345 000000009

Где \<и \>— границы слов, а [:xdigit:]соответствует шестнадцатеричной цифре.

1
28.01.2020, 02:18

Теги

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