Unix Sed не отступает, чтобы закончить работу - PullRequest
1 голос
/ 06 ноября 2019

Я пытаюсь создать скрипт для преобразования дампов postgres CSV в дампы Oracle csv. Ака, я пытаюсь заменить «true» на «Y» и «false» на «N».

Поэтому я хочу скрипт под названием to_oracle, например:

echo "false,false,false,true" | to_oracle
N,N,N,Y

вот моя попытка:

sed -E -e 's:(,|^)true(,|$):\1Y\2:g' -e 's:(,|^)false(,|$):\1N\2:g' "$@"

Логика заключается в том, что поле в CSV-файле начинается либо с начала строки, либо с запятой "," и заканчивается либо концом строки, либо запятой ","

Проблема с этим сценарием в том, что он жадно поглощает запятую, и поэтому каждое второе поле не работает:

echo "false,false,false,true" | to_oracle
N,false,N,Y

Теперь я полагаю, что могу дважды передать его в сценарий,и это сделало бы работу, но мне интересно, есть ли более элегантное решение?

Ответы [ 2 ]

2 голосов
/ 06 ноября 2019

awk версия:

echo "false,false,false,true" | awk -F, -v OFS=, '{for(i=1;i<=NF;i++) $i=$i=="true"?"Y":"N"}1'
N,N,N,Y

Он проверяет одно за другим поле, если его true используется Y, в противном случае используйте N

Если вы хотитетест для false, а также

echo "false,false,false,true" | awk -F, -v OFS=, '{for(i=1;i<=NF;i++) $i=($i=="true"?"Y":($i=="false"?"N":"other"))}1'
N,N,N,Y
1 голос
/ 06 ноября 2019

С GNU sed вы можете использовать

sed -E ':a;s/(,|^)false(,|$)/\1N\2/;ta; :b;s/(,|^)true(,|$)/\1Y\2/;tb'

См. онлайн-демонстрацию

Подробнее

  • -E включит синтаксис POSIX ERE
  • ':a;s/(,|^)false(,|$)/\1N\2/;ta; рекурсивно заменит false между запятыми или начало / конец строки на N
  • :b;s/(,|^)true(,|$)/\1Y\2/;tb' рекурсивно заменит true между запятыми или началом / концом строки с Y.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...