Просто замените от первого до последнего |
символом |
(или пробелом, если хотите):
sed 's/|.*|/|/'
Обратите внимание, что, хотя нет специальной sed
реализации, в которой |
есть особенность (если расширенные регулярные выражения не разрешены с помощью -E
или -r
в некоторых реализациях), \|
сама по себе она особенная в некоторых, таких как GNU sed
. Так что вам не следует убегать, |
если вы хотите, чтобы он соответствовал |
характеру.
Если заменить на пробел и если входные данные могут уже содержать строки только с одной |
, то вам нужно будет обработать это специально, так как |.*|
они не будут соответствовать этим. Это может быть:
sed 's/|\(.*|\)\{0,1\}/ /'
(то есть сделать .*|
часть необязательной) Или:
sed 's/|.*|/ /;s/|/ /'
или:
sed 's/\([^|]*\).*|/\1 /'
Если вам нужно первое и восьмое поля независимо от количества полей во входных данных, то это просто:
cut -d'|' -f1,8
(все они будут работать с любой POSIX-совместимой утилитой, если предположить, что входные формы имеют корректный текст (в частности, sed
они, как правило, не будут работать, если на входе есть байты или последовательности байтов, которые не образуют допустимых символов в текущей локали, как, например, printf 'unix|St\351phane|Chazelas\n' | sed 's/|.*|/|/'
в язык UTF-8)).