Я играл с футбольным набором данных BBC, который я написал пару месяцев назад, и хотел написать код, который будет использовать скрипт импорта и заменять все экземпляры удаленных URI на путь файловой системы.
Например, файл импорта содержит несколько строк, подобных этой:
1
2
3
|
LOAD CSV WITH HEADERS AS row |
И я хочу это прочитать:
1
2
3
|
LOAD CSV WITH HEADERS FROM "file:///Users/markneedham/repos/neo4j-bbc/data/matches.csv" AS row |
Началом этого пути также является мой рабочий каталог:
1
2
|
$ echo $PWD /Users/markneedham/repos/neo4j-bbc |
Поэтому я хотел написать скрипт, который будет искать вхождения https://raw.githubusercontent.com/mneedham/neo4j-bbc/master и заменять его на $ PWD. Я фанат Sed, поэтому я решил попробовать и использовать его для решения своей проблемы.
Первое, что мы можем сделать, чтобы упростить жизнь, — это изменить разделитель по умолчанию. Sed обычно использует «/» для разделения частей команды, но поскольку мы используем URI, это будет ужасно, поэтому вместо этого мы будем использовать подчеркивание.
Для первого сокращения я попытался просто удалить эту первую часть URI, но не заменять ее чем-то конкретным:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
|
LOAD CSV WITH HEADERS FROM "/data/matches.csv" AS row LOAD CSV WITH HEADERS FROM "/data/players.csv" AS row LOAD CSV WITH HEADERS FROM "/data/players.csv" AS row LOAD CSV WITH HEADERS FROM "/data/fouls.csv" AS row LOAD CSV WITH HEADERS FROM "/data/attempts.csv" AS row LOAD CSV WITH HEADERS FROM "/data/attempts.csv" AS row LOAD CSV WITH HEADERS FROM "/data/corners.csv" AS row LOAD CSV WITH HEADERS FROM "/data/corners.csv" AS row LOAD CSV WITH HEADERS FROM "/data/cards.csv" AS row LOAD CSV WITH HEADERS FROM "/data/cards.csv" AS row LOAD CSV WITH HEADERS FROM "/data/subs.csv" AS row |
Здорово! Это сработало, как и ожидалось. Теперь давайте попробуем заменить его на $ PWD:
01
02
03
04
05
06
07
08
09
10
11
12
|
$ sed 's_https://raw.githubusercontent.com/mneedham/neo4j-bbc/master_file://$PWD_' import .cql | grep LOAD LOAD CSV WITH HEADERS FROM "file://$PWD/data/matches.csv" AS row LOAD CSV WITH HEADERS FROM "file://$PWD/data/players.csv" AS row LOAD CSV WITH HEADERS FROM "file://$PWD/data/players.csv" AS row LOAD CSV WITH HEADERS FROM "file://$PWD/data/fouls.csv" AS row LOAD CSV WITH HEADERS FROM "file://$PWD/data/attempts.csv" AS row LOAD CSV WITH HEADERS FROM "file://$PWD/data/attempts.csv" AS row LOAD CSV WITH HEADERS FROM "file://$PWD/data/corners.csv" AS row LOAD CSV WITH HEADERS FROM "file://$PWD/data/corners.csv" AS row LOAD CSV WITH HEADERS FROM "file://$PWD/data/cards.csv" AS row LOAD CSV WITH HEADERS FROM "file://$PWD/data/cards.csv" AS row LOAD CSV WITH HEADERS FROM "file://$PWD/data/subs.csv" AS row |
Хм, это не сработало, как ожидалось. $ PWD трактуется как литерал, а не вычисляется так, как мы хотим.
Оказывается, это популярный вопрос о переполнении стека, и есть много предложений — я попробовал несколько из них и обнаружил, что одинарные кавычки сделали свое дело:
01
02
03
04
05
06
07
08
09
10
11
12
|
$ sed 's_https://raw.githubusercontent.com/mneedham/neo4j-bbc/master_file://' $PWD '_' import .cql | grep LOAD LOAD CSV WITH HEADERS FROM "file:///Users/markneedham/repos/neo4j-bbc/data/matches.csv" AS row LOAD CSV WITH HEADERS FROM "file:///Users/markneedham/repos/neo4j-bbc/data/players.csv" AS row LOAD CSV WITH HEADERS FROM "file:///Users/markneedham/repos/neo4j-bbc/data/players.csv" AS row LOAD CSV WITH HEADERS FROM "file:///Users/markneedham/repos/neo4j-bbc/data/fouls.csv" AS row LOAD CSV WITH HEADERS FROM "file:///Users/markneedham/repos/neo4j-bbc/data/attempts.csv" AS row LOAD CSV WITH HEADERS FROM "file:///Users/markneedham/repos/neo4j-bbc/data/attempts.csv" AS row LOAD CSV WITH HEADERS FROM "file:///Users/markneedham/repos/neo4j-bbc/data/corners.csv" AS row LOAD CSV WITH HEADERS FROM "file:///Users/markneedham/repos/neo4j-bbc/data/corners.csv" AS row LOAD CSV WITH HEADERS FROM "file:///Users/markneedham/repos/neo4j-bbc/data/cards.csv" AS row LOAD CSV WITH HEADERS FROM "file:///Users/markneedham/repos/neo4j-bbc/data/cards.csv" AS row LOAD CSV WITH HEADERS FROM "file:///Users/markneedham/repos/neo4j-bbc/data/subs.csv" AS row |
Мы также можем использовать двойные кавычки везде, если мы предпочитаем:
01
02
03
04
05
06
07
08
09
10
11
12
|
$ sed "s_https://raw.githubusercontent.com/mneedham/neo4j-bbc/master_file://" $PWD "_" import .cql | grep LOAD LOAD CSV WITH HEADERS FROM "file:///Users/markneedham/repos/neo4j-bbc/data/matches.csv" AS row LOAD CSV WITH HEADERS FROM "file:///Users/markneedham/repos/neo4j-bbc/data/players.csv" AS row LOAD CSV WITH HEADERS FROM "file:///Users/markneedham/repos/neo4j-bbc/data/players.csv" AS row LOAD CSV WITH HEADERS FROM "file:///Users/markneedham/repos/neo4j-bbc/data/fouls.csv" AS row LOAD CSV WITH HEADERS FROM "file:///Users/markneedham/repos/neo4j-bbc/data/attempts.csv" AS row LOAD CSV WITH HEADERS FROM "file:///Users/markneedham/repos/neo4j-bbc/data/attempts.csv" AS row LOAD CSV WITH HEADERS FROM "file:///Users/markneedham/repos/neo4j-bbc/data/corners.csv" AS row LOAD CSV WITH HEADERS FROM "file:///Users/markneedham/repos/neo4j-bbc/data/corners.csv" AS row LOAD CSV WITH HEADERS FROM "file:///Users/markneedham/repos/neo4j-bbc/data/cards.csv" AS row LOAD CSV WITH HEADERS FROM "file:///Users/markneedham/repos/neo4j-bbc/data/cards.csv" AS row LOAD CSV WITH HEADERS FROM "file:///Users/markneedham/repos/neo4j-bbc/data/subs.csv" AS row |
Ссылка: | Sed: Использование переменных среды от нашего партнера по JCG Марка Нидхэма в блоге Марка Нидхэма . |