Как я могу удалить определенную строку из файла, только если существуют другие строки в файле?

grep -l "string" * | wc -l будет искать "строку" в содержании всех файлов в рабочем каталоге и говорить Вам сколько подобранный.

5
03.02.2017, 23:13
5 ответов

В bash, использование sed:

if [[ $(< "$file") != "ASDF" ]]; then
  sed -i '/^ASDF$/d' "$file"
fi
6
27.01.2020, 20:38

Принятие Ваших имен файлов не содержит символы новой строки, это удалит строки, содержащие просто ASDF из всех файлов в текущем каталоге, если файл не состоит из одной строки, содержащей просто ASDF. Если Ваш sed не имеет -i опция, вывод во временный файл и перемещение это на месте впоследствии.

grep -l ASDF -- * | while IFS= read -r filename; do
  if ! echo 'ASDF' | cmp -s - "$filename"; then
    sed -i -e '/^ASDF$/d' -- "$filename"
  fi
done

Вот другой подход, который удаляет ASDF строки, и только перезаписывают исходный файл, если новый файл не пуст и не идентичен оригиналу.

tmpfile=$(mktemp -p "$(dirname -- "$filename")")
sed '/^ASDF$/' <"$filename" >"$tmpfile"
if [ -s "$tmpfile" ] && ! cmp -s -- "$filename" "$filename"; then
  mv -f -- "$tmpfile" "$filename"
else
  rm -- "$tmpfile"
fi
1
27.01.2020, 20:38

Вы хотели бы искать количество строк в файле.

Псевдокод:

if (numberOfLines > 1 && file.contains("ASDF")) {
    file.remove("ASDF");
}
0
27.01.2020, 20:38

Более короткая версия ответа enzotib:

[[ $(< "$file") != "ASDF" ]] && sed -i '/^ASDF$/d' "$file"
0
27.01.2020, 20:38

Вы можете сделать это sed - только, без тестов оболочки и еще много чего:

sed '1{/^ASDF$/{$q;d;};}' infile
0
27.01.2020, 20:38

Теги

Похожие вопросы