У меня есть файл 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
, но я не знаком с этим.
command-line
bash
text-processing
mcExchange
источник
источник
| cut -d/ -f3
в трубе сделало свое дело. Спасибо! Теперь это полная команда:while read p; do echo $p; done < filelist.txt | cut -d/ -f3
cut -d/ -f3 filelist.txt
Вы можете сделать это прямо в вашей
read
команде, используяIFS
переменную, напримеристочник
Ты можешь использовать
awk
источник
Если нам нужен какой-либо элемент пути, лучше всего использовать что-то, что может разбить строку на поля, такие как AWK, резать ,питон, или Perl, Однако,удар также может выполнять работу с подстановкой параметров, используя замену шаблона и выбрасывая все в массив.
Теперь у нас есть массив предметов, сделанных из пути. Обратите внимание, что если путь содержит пробелы, он может включать изменение внутреннего разделителя полей
IFS
.источник
Bash и
cut
путь, однако альтернатива с использованием Perl:для второго
/
неограниченного поля иза третье-
/
неограниченное поле.-l
: включает автоматическую обработку конца строки. У него есть два отдельных эффекта. Во-первых, он автоматически разбивает $ / (разделитель входных записей) при использовании с -n или -p. Во-вторых, он присваивает $ \ (разделителю выходной записи) значение octnum, чтобы в любом операторе печати этот разделитель был добавлен обратно. Если октнум опущен, устанавливает $ \ текущее значение $ /.-a
: включает режим автоматического разделения при использовании с -n или -p. Неявная команда split для массива @F выполняется в первую очередь в неявном цикле while, создаваемого -n или -p.-n
: заставляет Perl принять следующий цикл вокруг вашей программы, который заставляет его перебирать аргументы имени файла, вроде sed -n или awk:-e
: может использоваться для ввода одной строки программы;print(@F[N])
: печатает N-ное поле.источник