Замена нескольких символов на новую строку

В случае bashэто зависит от того, находится ли $SHELLOPTSв среде или нет.

bash-4.4$ export SHELLOPTS
bash-4.4$ set -x
bash-4.4$ bash -c 'echo x'
+ bash -c 'echo x'
+ echo x
x

Посмотрите, как bash -c 'echo x'унаследовал опцию xtrace. Для опций, установленных с помощью shopt, это то же самое, но с переменной $BASHOPTS.

Это особенно удобно для опции xtraceдля отладки, когда вы хотите запустить bashскрипт (или любую команду, выполняющую bashскрипт )и все другие bashскрипты, которые он может вызвать., рекурсивно сxtrace(при условии, что ничего не делает set +xв этих скриптах ). Если ваш sh— это bash, это также повлияет на них, как и на system("command line"), сделанные на других языках :

.
env SHELLOPTS=xtrace some-command
0
26.06.2019, 17:51
4 ответа

Может быть сложно принудительно ввести новую строку в команду sed s///.

Предполагая, что вы также хотите очистить пробелы до и после --, awk является хорошим кандидатом:

$ awk -F' *-- *' -v OFS='\n' '{$1=$1}1' file
0.5, 14, 14, 12, 1.000000736101224E-11,
0.5, 14, 14, 14, 9.999999999999996E-12,

$1=$1— это идиома awk, которая заставляет текущую запись перезаписываться с использованием другого разделителя полей.

1
28.01.2020, 02:39

Использование GNUsed:

$ gsed 's/, -- /\n/' file
0.5, 14, 14, 12, 1.000000736101224E-11
0.5, 14, 14, 14, 9.999999999999996E-12,

Однако стандарт sedне позволяет вставлять новые строки с помощью команды s, но вы могли бы использовать тот факт, что добавление из пробела добавит новую строку в пространство шаблонов:

$ sed 'h;s/, --.*//;G;s/\(\n\).*, -- /\1/' file
0.5, 14, 14, 12, 1.000000736101224E-11
0.5, 14, 14, 14, 9.999999999999996E-12,

Это копирует пространство шаблонов (строку )в пространство хранения с помощью h, затем удаляет последний бит, так что остается только «первая строка». Затем он добавляет копию исходных данных в пространство шаблонов со встроенной новой строкой в ​​качестве разделителя с G. Бит между новой строкой и шаблоном, который мы рассматриваем как наш разделитель, заменяется новой строкой, и результат печатается.

Вполне возможно, что существует более элегантный способ сделать это с не -GNU sed.

1
28.01.2020, 02:39

@glenn jackman и @Kusalananda правы, есть хитрость в использовании новой строки в строке замены sed.И да, это не -GNU sed (BSD ).

Хитрость заключается в заключении аргументной части флага -e в кавычки, так как аргумент содержит новую строку. Первая часть трюка заключается в том, что использование кавычек позволяет поместить буквальную новую строку в токен замены -e; и вторая часть заключается в том, что такая новая строка должна быть экранирована обратной косой чертой -для sed. В синтаксисе скрипта это выглядит как:

sed -Ee "s/, +-- +/\\
/" < test.txt

Набрано вручную в командной строке (и с приглашением продолжения bash>), это больше похоже на:

$ sed -Ee "s/, +-- +/\\
> /" < test.txt
0.5, 14, 14, 12, 1.000000736101224E-11
0.5, 14, 14, 14, 9.999999999999996E-12,

Внутри кавычек двойная обратная косая черта -преобразуется в одинарную обратную косую черту, потому что для sed требуется литерал (? )символы новой строки в строке замены для обратной косой черты -экранированы. Без двойной обратной косой черты -вы увидите, что он жалуется:

$ sed -Ee "s/, +-- +/  
/" < test.txt
sed: 1: "s/, +-- +/
/
": unescaped newline inside substitute pattern
0
28.01.2020, 02:39

С командой sed у меня все работало нормально

команда

echo "0.5, 14, 14, 12, 1.000000736101224E-11, -- 0.5, 14, 14, 14, 9.999999999999996E-12,"| sed "s/, -- /\n/g" 

выход

0.5, 14, 14, 12, 1.000000736101224E-11
0.5, 14, 14, 14, 9.999999999999996E-12,
-1
28.01.2020, 02:39

Теги

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