вырезать, но оставить последний разделитель?

Вероятно, самым простым способом будет простой grep:

grep -E -o "([0-9]{1,3}[\.]){3}[0-9]{1,3}" /path/to/sourcefile > output.txt

Это позволит извлечь все IP-адреса из исходного файла и записать их в файл output.txt, разделив их новой строкой.

0
28.12.2019, 20:34
3 ответа

Использование только встроенных функций bash

strip_slashes(){
   declare -n stripped=$1
   local -i i      
   stripped=$3
   for((i=0;i<$2;i++)) ; do
       stripped=${stripped#*/}
   done
   stripped="/$stripped"
}

Это вызывается как

strip_slashes X 3 "/home/user/test/folder"
echo $X

Первый параметр — это имя переменной для хранения результата, затем количество удаляемых косых черт и значение, из которого их следует удалить.

Передача имени переменной для хранения результата означает, что вам не нужно жестко кодировать имя (, например. REPLY используется по умолчанию для выбора и чтения )и не нуждается в подоболочке. Послеdeclare -nstrippedследует псевдоним именованной переменной.

sed решения. Использование gnu sed

echo /home/user/test/folder | sed -E 's:(/[^/]*){2}::'

более портативный

echo /home/user/test/folder | sed 's:/[^/]*/[^/]*::'
4
28.01.2020, 02:13

Если предположить, что /home/user/test/folderявляется содержимым некоторой переменной dirpath, и что домашний каталог текущего пользователя, заданный $HOME, равен /home/user, тогда следующий код напечатает Path under $HOME directory is "/test/folder".

dirpath=/home/user/test/folder
printf 'Path under $HOME directory is "%s"\n' "${dirpath#$HOME}"

Это достигается путем удаления строки префикса $HOMEиз $dirpathс помощью стандартного расширения параметра.

Это может быть обобщено на другие пути, отличные от описанных в$HOME:

dirpath=/0/1/2/somewhere/output/test/folder
topdir=${dirpath%/*/*}
printf 'The path under "%s" is "%s"\n' "$topdir" "${dirpath#$topdir}"

Это напечатает The path under "/0/1/2/somewhere/output" is "/test/folder".

Значение для topdirзадается путем удаления всего, что соответствует /*/*, с конца $dirpathс использованием стандартной подстановки параметров. Образец /*/*должен точно соответствовать тому, что мы позже хотим найти в конце $dirpath, в данном случае двум последним компонентам пути $dirpath.

После нахождения $topdirмы просто повторяем упражнения, как мы это делали, когда самым верхним -каталогом был $HOME.

4
28.01.2020, 02:13

Поскольку вы знаете разделитель, нет ничего плохого в том, чтобы добавить его снова.

path="/$(echo "/home/user/test/folder" | cut -d'/' -f4-)"
echo "$path"
3
28.01.2020, 02:13

Теги

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