У меня есть файл ASCII, содержащий пути к файлам, которые я прочитал, выполнив:
while read p; do echo $p; done < filelist.txt
Файл содержит пути к файлам со следующим шаблоном:
./first/example1/path
./second/example1/path
./third/example2/path
Как получить определенную часть строки пути (от /
до /
), например Мне нужно получить вывод, который печатает:
first
second
third
, а также
example1
example1
example2
Я уверен, что есть способ сделать это с помощью регулярных выражений и sed
, но я Я не знаком с этим.
Используйте cut
:
$ cat filelist.txt
./first/example1/path
./second/example1/path
./third/example2/path
$ cut -d/ -f2 filelist.txt
first
second
third
$ cut -d/ -f3 filelist.txt
example1
example1
example2
-d/
наборы разделитель столбца к /
и эти -f2
выбирает 2-й столбец.
можно, конечно, также использовать переменные Bash вместо имени файла или передать данные по каналу в эти cut
команда:
cut -d/ -f3 $MyVariable
echo ./another/example/path | cut -d/ -f3
Можно использовать awk
pilot6@Pilot6:~$ cat filelist.txt
./first/example1/path
./second/example1/path
./third/example2/path
pilot6@Pilot6:~$ awk -F "/" '{print $2}' filelist.txt
first
second
third
pilot6@Pilot6:~$ awk -F "/" '{print $3}' filelist.txt
example1
example1
example2
Вы могли сделать это непосредственно в Вашем read
команда, с помощью IFS
переменная, например,
$ while IFS=/ read -r p1 p2 p3 r; do echo "$p2"; done < filelist.txt
first
second
third
swapoff
против sda5, и затем измените размеры левой стороны sda2 и измените размеры sda1, и swapon
sda5. На различной ноте, Ваш / и Ваша подкачка являются слишком маленькими. Лучше всего для изменения размеров тех, когда Вы можете. Вы редактировали/etc/fstab с новым UUID для подкачки?
– heynnema
26 June 2017 в 02:22
Bash и cut
путь состоит в том, чтобы пойти, однако альтернативный Perl использования:
perl -F/ -lane 'print(@F[1])' filelist.txt
для второго /
- разграниченное поле и
perl -F/ -lane 'print(@F[2])' filelist.txt
для третьего /
- разграниченное поле.
-l
: включает автоматическую заканчивающую строку обработку. Это имеет два отдельных эффекта. Во-первых, это автоматически громко жует $ / (входной разделитель записей) при использовании с-n или-p. Во-вторых, это присваивает $\\(выходной разделитель записей), чтобы иметь значение octnum так, чтобы любые операторы печати имели тот разделитель включенным назад. Если octnum опущен, $наборов \\к текущему значению $/.-a
: включает режим авторазделения при использовании с-n или-p. Неявная команда разделения к массиву @F сделана как первая вещь в неявном цикле с условием продолжения, произведенном-n или-p.-n
: Perl причин для принятия следующего цикла вокруг программы, которая заставляет его выполнить итерации по аргументам имени файла несколько как sed-n или awk:
LINE:
while (<>) {
... # your program goes here
}
-e
: может использоваться для ввода одной строки программы;
print(@F[N])
: печатает поле Nth.% cat filelist.txt
./first/example1/path
./second/example1/path
./third/example2/path
% perl -F/ -lane 'print(@F[1])' filelist.txt
first
second
third
% perl -F/ -lane 'print(@F[2])' filelist.txt
example1
example1
example2
Если мы хотим какой-либо элемент пути, лучше использовать что-то, что может разбить строку в поля, такие как awk, сократить, Python или жемчуг. Однако удар может также сделать задание с заменой параметра, с помощью замены шаблона и бросив все в массив.
$> echo ${FILE//\//\ }
sys class backlight intel_backlight brightness
$> ARRAY=( ${FILE//\//" " } )
$> echo ${ARRAY[2]}
backlight
$> FILE="./dir1/dir2/file.txt"
$> ARRAY=( ${FILE//\/" "} )
$> echo ${ARRAY[@]}
. dir1 dir2 file.txt
$> echo ${ARRAY[1]}
dir1
Теперь у нас есть массив объектов, сделанных из пути. Обратите внимание, что, если путь содержит пробелы, он может включить изменяющегося внутреннего разделителя полей IFS
.
linux-swap
причина раздела проблема. – Yaron 26 June 2017 в 01:57