Удалить 2-й случай после заданного флага - PullRequest
0 голосов
/ 22 октября 2019

Как можно разобрать каждую строку в файле .txt, чтобы удалить все после второго появления / после заданного флага jdk в каждой строке файла.

Например,

/usr/lib/jvm/jdk-1.7.0/2.0/zi/etc/GMT
/usr/lib/jvm/jdk1.7.2/3.0/zi/etc/GMT
/usr/share/servertool-java-openjdk/4.0/jce.jar

становится

/usr/lib/jvm/jdk-1.7.0/2.0/
/usr/lib/jvm/jdk1.7.2/3.0/
/usr/share/servertool-java-openjdk/4.0/

Обратите внимание, я не могу просто разделить на jdk, потому что это может быть jdk-1.*.*/ etc.

Моя конечная цель состоит в том, чтобы найти все уникальные пути в строго ограниченном окне SeLinux, в котором выходные данные locate jdk хранятся в файле output.txt

Обновление: моя попытка приблизиться к этому - это

cat output.txt | awk -F '\\jdk' '{print $1"jdk"}' | sort -u 

Это просто прерывает все после jdk и удаляет дубликаты.

Ответы [ 2 ]

3 голосов
/ 22 октября 2019

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

Обратите внимание, что косые черты в команде s/// могут быть изменены на другие символы, так что любые косые черты, которые есть вдетали или запасные части не нужно экранировать.

Ваш шаблон будет:

  • в круглых скобках:
    • "jdk", за которым следует ноль или болеебез косой черты
    • , за которой следует косая черта
    • , за которой следует одна или несколько неперерезанных черт
    • с последующей косой чертой
  • на любое количество символов

Заменой будет захваченный текст.

Вы можете обратиться к руководству по sed

2 голосов
/ 22 октября 2019

если вы хотите заменить в том же файле, вы можете использовать ниже скрипт

#!/bin/bash
cat output.txt | while read line
do
x=${line#/*jdk*/*/}
replace=${line%${x}}
sed -i "s|$line|$replace|g" output.txt
done
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...