как заменить точку на дефис с помощью команды sed

Я модифицировал решение sinelaw , чтобы оно соответствовало POSIX. Он не следует символическим ссылкам и включает поиск в корневом каталоге с использованием цикла do while.

find-up:
#!/usr/bin/env sh

set -e # exit on error
# Use cd and pwd to not follow symlinks.
# Unlike find, default to current directory if no arguments given.
directory="$(cd "${1:-.}"; pwd)"

shift 1 # shift off the first argument, so only options remain

while :; do
  # POSIX, but gets "Permission denied" on private directories.
  # Use || true to allow errors without exiting on error.
  find "$directory" -path "${directory%/}/*/*" -prune -o ! -path "$directory" "$@" -print || true

  # Equivalent, but -mindepth and -maxdepth aren't POSIX.
  # find "$directory" -mindepth 1 -maxdepth 1 "$@"

  if [ "$directory" = '/' ]; then
    break # End do while loop
  else
    directory=$(dirname "$directory")
  fi
done

3
19.05.2021, 17:53
2 ответа

sed использует регулярные выражения для поиска текста, который нужно изменить, а в регулярных выражениях .означает соответствие любому символу. Ваша команда говорит sed изменить любой символ на -.

Чтобы исправить это, вам нужно экранировать ., поставив перед ним \, чтобы указать sed, чтобы он совпадал только с фактическими периодами:

sed 's/\./-/g' iplist.txt
7
28.07.2021, 11:30

Это задание дляtr(1):

tr. - < infile > outfile
1
28.07.2021, 11:30

Теги

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