У меня есть file.txt, который мне нужно прочитать в массив Bash. Затем мне нужно удалить пробелы, двойные кавычки и все, кроме первой запятой в каждой записи . Вот как далеко я продвинулся:
$ cat file.txt
10,this
2 0 , i s
30,"all"
40,I
50,n,e,e,d,2
60",s e,e"
$ cat script.sh
#!/bin/bash
readarray -t ARRAY<$1
ARRAY=( "${ARRAY[@]// /}" )
ARRAY=( "${ARRAY[@]//\"/}" )
for ELEMENT in "${ARRAY[@]}";do
echo "|ELEMENT|$ELEMENT|"
done
$ ./script.sh file.txt
|ELEMENT|10,this|
|ELEMENT|20,is|
|ELEMENT|30,all|
|ELEMENT|40,I|
|ELEMENT|50,n,e,e,d,2|
|ELEMENT|60,se,e|
Который прекрасно работает, за исключением ситуации с запятой. Я знаю, что есть несколько способов сделать скин для этого кота, но из-за большого скрипта, частью которого я являюсь, я действительно хотел бы использовать подстановку параметров, чтобы добраться сюда:
|ELEMENT|10,this|
|ELEMENT|20,is|
|ELEMENT|30,all|
|ELEMENT|40,I|
|ELEMENT|50,need2|
|ELEMENT|60,see|
Это возможно с помощью замены параметров?
awk
илиsed
выполнить обработку данных?Ответы:
Я бы удалил то, что нужно удалить, используя
sed
перед загрузкой в массив (также обратите внимание на имена переменных в нижнем регистре, в общем случае лучше избегать заглавных букв в сценариях оболочки):Это приводит к следующему выводу вашего файла примера:
Если вы действительно должны использовать подстановку параметров, попробуйте что-то вроде этого:
источник
RANDOMTEXTTHATWILLNEVERBEINTHEFILE
.Насколько я вижу, нет необходимости читать его в
bash
массив для создания этого вывода:sed
Выражение удаляет пробела и двойные кавычки, заменяют первую запятую с пробелом (нет других пробелов в строке в этой точке), удаляет все остальные запятые, восстанавливает первую запятую, и добавлять в начале и добавляет дополнительные данные.В качестве альтернативы, с GNU
sed
:(стандарт
sed
не поддерживает комбинацию2
иg
как флаги дляs
команды).источник
's/,//2g
для удаления запятых, начиная со 2-гоs/.*/|ELEMENT|&|/
но это может быть больше усилий для sed.Избавьтесь от привычки использовать имена переменных ALLCAPS. В конечном итоге вы столкнетесь с критической «системной» переменной, такой как PATH, и сломаете свой код.
источник
PATH=something; ls $PATH
а потом задумался обls: command not found
ошибке.[Это, по сути, более полная версия ответа Гленна Джекмана ]
Создание ассоциативного массива из разделенного ключа и значения с использованием первой запятой в качестве разделителя:
источник
Вы можете перебрать массив и использовать промежуточную переменную:
Это присваивается
rest
части после первой запятой; затем мы объединяем три части обратно в исходную переменную:rest
каждой запятой ни с чемисточник