Кажется, в вашей команде sed есть случайная косая черта в начале:
sed "/s/'//g"
должно быть:
sed "s/'//g"
Если вам нужно несколько выражений, просто используйте -e
для них обоих (здесь я предполагаю вместе с Гленном Джекманом, что вы хотите '
вместо только & apos
):
sed -e "s/'//g" -e "s/'//g" filename
Вы можете использовать произвольную команду, например ls
, чтобы проверить файлы и удалить их в одной строке
ls /tmp/bbsnode{1,2,3,4} &>/dev/null && rm /tmp/bbsnode{1,2,3,4}
Обратите внимание, что в целом небезопасно делать такие вещи в / tmp, потому что любой другой пользователь может создать конфликтующие файлы с одинаковыми именами.
Краткое объяснение:
Возвращаемое значение ls
не равно нулю, если один из файлов не существует. {1,2,3,4}
- это расширение скобок: оно расширяется до строки для каждого числа: поэтому / tmp / bbsnode {1,2,3,4}
является то же, что и / tmp / bbsnode1 / tmp / bbsnode2 / tmp / bbsnode3 / tmp / bbsnode4
. &&
выполняет следующую команду, только если предыдущая команда имеет нулевое возвращаемое значение, и поэтому здесь rm
выполняется, только если все 4 файла существуют. Наконец, &> / dev / null
подавляет вывод ls
( &>
перенаправляет как stdout
, так и stderr
, / dev / null
избавляется от него).
Ниже другое решение только со встроенными командами оболочки. Это похоже на то, что ответили другие, но без дополнительной функции или скрипта:
set -- /tmp/bbsnode{1,2,3,4}
(for f; do test -f "$f" || exit; done) && rm -- "$@"
В этом конкретном случае вы можете сделать:
set -- file[1-4]
[[ $# -eq 4 ]] && rm -f -- "$@"
Этот устанавливает
список аргументов для имен файлов, которые соответствуют любому из file1
, file2
, file3
или file4
1 , затем rm
с этими файлами, только если количество аргументов равно 4, то есть, если все файлы существуют.
1: для простоты я использую файл
вместо / tmp / bbsnode