sed + удаляют первый каталог из пути

Обратитесь к этой странице (RPi Легкая Установка SD-карты) для получения дополнительной информации об установке НОВИЧКОВ и Rasp Pi. Эта страница имеет много деталей для различных горящих сценариев, слишком многочисленных для списка здесь.

Ссылки

2
09.03.2019, 10:32
3 ответа

Попробуйте:

echo "/mnt/VPfig/Amer/AR4/Celtel/files/COM.txt" | sed 's|^/[^/]*||'

, что дало мне:

/VPfig/Amer/AR4/Celtel/files/COM.txt

Ищет первые /, за которыми следует как можно больше не/s, а затем заменяет их пустой строкой.

5
27.01.2020, 21:50

В оболочке POSIX:

$ x='/mnt/VPfig/Amer/AR4/Celtel/files/COM.txt'
$ printf "/%s\n" "${x#/*/}"
/VPfig/Amer/AR4/Celtel/files/COM.txt

Объяснение

Расширение параметра $ {x # / * /} удаляет ведущий компонент пути с двумя / , окружающими его, и printf закрепляет ведущий / обратно.

3
27.01.2020, 21:50

Самый простой способ - удалить самую короткую строку, состоящую из символов, отличных от / , из начала строки.

В большинстве языков регулярных выражений [] - это класс символов, который соответствует чему-либо в квадратных скобках. [abc] будет соответствовать либо a , либо b , либо c . [^] - это инвертированный символьный класс, соответствующий чему угодно, кроме символов в нем. Таким образом, [^ /] * будет соответствовать самой длинной строке символов, отличных от / . ^ в начале регулярного выражения приводит к совпадению только в начале входной строки. Комбинируя их, вы можете:

$ echo "/mnt/VPfig/Amer/AR4/Celtel/files/COM.txt" | sed 's/^\/[^/]*//'
/VPfig/Amer/AR4/Celtel/files/COM.txt

Или вы можете установить разделитель полей ввода awk на / и вывести все, кроме последнего поля:

$ echo "/mnt/VPfig/Amer/AR4/Celtel/files/COM.txt" | 
    awk -F/ '{for(i=3;i<=NF;i++){printf "/%s",$i};print ""}'

Или вы можете использовать некоторые уловки Perl:

$ echo "/mnt/VPfig/Amer/AR4/Celtel/files/COM.txt" | 
    perl -F/ -lane 'print "/",join "/",@F[2..$#F]'
/VPfig/Amer/AR4/Celtel/files/COM.txt

или, лучшая уловка Perl , предложенная @Joseph R. :

$ echo "/mnt/VPfig/Amer/AR4/Celtel/files/COM.txt" | perl -pe 
   perl -pe 's{^/.*?(?=/)}{}'

или даже просто:

$ echo "/mnt/VPfig/Amer/AR4/Celtel/files/COM.txt" | perl -pe 's#/[^/]+/#/#'
/VPfig/Amer/AR4/Celtel/files/COM.txt

Наконец, вы также можете использовать мощь регулярных выражений Perl с grep :

$ echo "/mnt/VPfig/Amer/AR4/Celtel/files/COM.txt" | grep -oP '/[^/]+?\K/.*'
/VPfig/Amer/AR4/Celtel/files/COM.txt
2
27.01.2020, 21:50

Теги

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