Использование GNUsed
:
sed 's/,/<COMMA>/2g' infile
Или портативность:
sed 's/,/<COMMA>/g; s/<COMMA>/,/' infile
Вы можете сделать это вручную, но использование getopt
будет полезнее в дальнейшем. Рассмотрим, например,:
#!/bin/bash
# Prints first set of lines from named files.
# $1 NUM Number of lines to print
# $2 DIR Directory
headrc() {
eval set -- $(getopt --name "${FUNCNAME[0]}" --options h --longoptions help -- "${@}")
while [[ "${1}" != "--" ]]; do
case "${1}" in
-h | --help)
printf "Usage: ${FUNCNAME[0]} [-h|--help] <args>\n"
return 1
;;
*)
printf "Unknown option: ${1}\n"
;;
esac
shift # Shift off option
done
shift # Shift off --
local -r num="${1}"
local -r dir="${2}"
find "${dir}" \( -name \*.org -o -name \*.texi \) | xargs head -n "${num}";
}
Инструмент getopt
берет существующие аргументы(${@}
)и параметры, которые вы ему задали, и переупорядочивает их таким образом, что сначала идут все параметры, затем --
и все остальное. Параметр --options
определяет односимвольные -опции, а --longoptions
указывает «длинные» (многосимвольные -опции ).
Например:
$ getopt --options fh --longoptions file,help -- a b c -f d e --help g
-f --help -- 'a' 'b' 'c' 'd' 'e' 'g'
Обратите внимание, что getopt
поддерживает опции с параметрами, но, поскольку вам это здесь не нужно, я не рассматривал этот аспект инструмента.
eval set --
обновляет аргументы до заданных значений, перезаписывая то, что функция видит в качестве своих аргументов, в вывод getopt
.
Цикл while
обрабатывает опции; опции останавливаются, когда встречается --
. Если см. -h
или --help
, он печатает справочное сообщение и возвращается. Каждый раз, когда он обрабатывает цикл, он использует shift
, чтобы «сдвинуть» первый аргумент.
Как только он находит --
, он останавливает цикл и отключает этот аргумент.
Теперь у вас осталось все, что было после опций, так что вы можете использовать позиционные аргументы, как и раньше.