Одна вещь, которую вы, кажется, ищете, - это синтаксический анализ командной строки. Приличный синтаксический анализ может быть выполнен с помощью корпуса
в оболочке POSIX.
Следующий AWK вполне подходит для выполнения этого преобразования. Чтобы сделать это на месте, у вас есть две альтернативы: использовать GNU awk (с -i
), как предлагает Джон, или использовать временный файл. Ниже приведен пример использования mktemp
, хотя mktemp
не является POSIX , он присутствует практически в любой системе * nix
#!/bin/sh
while test $# -gt 0
do
case "$1" in
-f)
file="$2"
shift
shift
;;
--edit)
id="$2"
column="$3"
value="$4"
shift
shift
shift
shift
;;
*)
echo "Usage:"
echo " $0 -f --edit "
exit
;;
esac
done
# debug
echo "edit [$file] in [$id] change column [$column] to [$value]"
tmpf=`mktemp`
awk -v FS="|" -v OFS="|" "/^$id/ { \$$column = \"$value\" }1" "$file" > "$tmpf"
mv "$tmpf" "$file"
Идея состоит в том, чтобы избежать правильных символов при передаче программа для awk. Предполагая, что приведенный выше сценарий называется script.sh
, вы можете просто сделать:
./script.sh -f myfile --edit 1001 3 "It's a me Mario"
У этого все еще есть некоторые проблемы, которые я рассмотрю ниже, чтобы не кластеризовать его. Во-первых, вы также должны проверить наличие пустого числа аргументов:
if test $# -eq 0
then
echo Usage
exit
fi
И, во-вторых, использование простого mv
иногда опасно. В частности, когда что-то идет не так, и скрипт не выводит результат. Всегда полезно добавить что-то подобное вокруг mv
, которое перезапишет ввод:
if test -s "$tmpf"
then
mv "$tmpf" "$file"
else
echo Something went wrong
fi