Изменение текста только в первом столбце? [дубликат]

После некоторого эксперимента я могу подтвердить, что на самом деле это происходило в сочетании с огромным разделом подкачки (16 ГБ).

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

В качестве меры безопасности я уменьшу максимальное пространство подкачки в моей системе. Я также определил ограничение для каждого процесса, чтобы защитить память от одного процесса:

# limit memory usage to 10G per process
ulimit -Sv 10000000

Инструменты, такие как vmstat 1 , могут помочь проанализировать проблему.

4
11.12.2018, 11:25
3 ответа
$ awk '{ sub("\.com$", ".org", $1); print }' <file
foobar@example.org foo@example.com,bar@example.com

Здесь используется awkдля замены текста, совпадающего с \.com$на .orgв первом пробеле -разделенном поле (только )каждой строки. Вывод будет разделен пробелом -.

4
27.01.2020, 20:46

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

sed -r 's/^(\S+)\.com(\s+)/\1.org\2/'

Во время -пн, изменить:

  1. последовательность из одного или нескольких не -пробелов с начала(^(\S+))
  2. .com
  3. последовательность из одного или нескольких не пробелов (, так что мы можем сопоставить только конечный.com)

в:

  1. первая последовательность не -пробелов
  2. .org
  3. последовательность пробелов
4
27.01.2020, 20:46

Если вы просто хотите заменить первое вхождение .comна .org, все, что вам нужно, это поведение по умолчанию оператора sed s///. Только не используйте флаг g:

$ sed 's/.com/.org/' file 
foobar@example.org foo@example.com,bar@example.com

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

$ perl -pe 's/^(\S+)\.com/$1.org/' file 
foobar@example.org foo@example.com,bar@example.com

Или, что безопаснее, если comвстречается как подстрока (, например.foo.common.net):

$ perl -pe 's/^(\S+)\.com\b/$1.org/' file 
foobar@example.org foo@example.com,bar@example.com

Альтернативно, в GNU sed:

$ sed -E 's/^(\S+)\.com\b/\1.org/' file 
foobar@example.org foo@example.com,bar@example.com

Или, переносимо (, предполагая, что первое поле определяется первым пробелом , а не табуляцией или другим пробелом):

$ sed -E 's/^([^ ])\.com /\1.org /' file 
foobar@example.org foo@example.com,bar@example.com
5
27.01.2020, 20:46

Теги

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