Провозившись с этим целый день, я понял это почти сразу после того, как задал вопрос здесь...
Я смог исправить это, включив новую строку в критерии поиска команды perl. похоже, что он просто оставил новую строку, которая уже была в строке после закрывающего тега xml, а затем добавил дополнительную из команды «кошка».
perl -i -p0e 's;<values>.*<\/values>\n;`cat replace.xml`;sge' test.xml
Изменить :Благодаря ответу mosvy я нашел другое решение, которое будет работать, если заменяемый текст не имеет завершающей новой строки, как это было в моем случае:
perl -i -p0e 's;<values>.*<\/values>;`head -c -1 replace.xml`;sge' test.xml
использование head вместо cat предотвращает вывод дополнительной новой строки
Вы можете использовать что-то вроде:
VARIABLE=$(awk -F\: '{print $4}' input_file)
это назначит 4-й параметр переменной с именемVARIABLE
Предполагая, что использование awk
не является обязательным, используйте функции Bash, чтобы избежать использования внешнего процесса:
IFS=':' read _ _ myCol3 myCol4 _ < myFile
_
является допустимым именем переменной, но принято использовать его как точку отбрасывания. Последний _
получает все дополнительные поля.
Я заметил, что данные вашего примера имеют пять значений, а не 4, которые вы указали.
Редактировать :Чтобы установить несколько значений массива, извлеченных из файла (, в этом случаестрока 11 моего файла пароля):
$ myArray+=( $( awk < /etc/passwd '-F:' 'NR == 11 { print $1, $3, $6; }' ) )
$ declare -p myArray
declare -a myArray=([0]="uucp" [1]="10" [2]="/var/spool/uucp")
$ echo "${myArray[1]}"
10