Получить один элемент строки пути, используя bash

У меня есть файл 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, но я Я не знаком с этим.

8
задан 24 March 2016 в 18:58

5 ответов

Используйте 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
14
ответ дан 25 March 2016 в 04:58
  • 1
    @Ilan - Счастливый, что это помогло Вам!:) У меня была та же проблема, в прошлом взял меня некоторое время, чтобы выяснить что linux-swap причина раздела проблема. – Yaron 26 June 2017 в 01:57

Можно использовать 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
5
ответ дан 25 March 2016 в 04:58
  • 1
    Я подозреваю, что Вы совершенно корректны. То, что я сделал, на самом деле, должно было сделать swapoff, удалить подкачку, изменить размеры, и затем добавить его. Критический момент был подкачкой, блокировал изменять размеры возможность. У меня есть 12 ГБ RAM, таким образом, подкачка никогда не привыкает. – Ilan 26 June 2017 в 20:09

Вы могли сделать это непосредственно в Вашем read команда, с помощью IFS переменная, например,

$ while IFS=/ read -r p1 p2 p3 r; do echo "$p2"; done < filelist.txt 
first
second
third
10
ответ дан 25 March 2016 в 04:58
  • 1
    После того, как загруженный к Ubuntu Живой DVD/USB, все, что необходимо было сделать, к выпуску a 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
1
ответ дан 25 March 2016 в 04:58
  • 1
    @Jonathan нет, Вы can' t выполненный GNOME Shell или GNOME расширения Shell, под Единицей. – heynnema 15 December 2018 в 10:52

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

$> 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 .

3
ответ дан 25 March 2016 в 04:58
  • 1
    Для ясности, если I' m в Единице делает это означает меня can' t используют расширения оболочки гнома? – Jonathan 15 December 2018 в 10:45

Другие вопросы по тегам:

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