Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   Пересчет буквенных прав в цифровые в любом текстовом файле (http://forum.oszone.net/showthread.php?t=327756)

blackeangel 21-06-2017 00:03 2746206

Пересчет буквенных прав в цифровые в любом текстовом файле
 
Мучаюсь второй день, не могу понять как реализовать.

В общем надо написать одну регулярное выражение которое охватывало сразу 4 варианта нахождения шаблона в строке согласно его позиции
1) вначале строки
2) в середине строки
3)в конце строки
4) только шаблон
С 2м и 3м я сделал так
Код:

"^(.*)(.*shablon)(.*)$"
Но это не применимо к началу строки: отрывает первый символ что стоит у шаблона, он тоже нужен(но тк он переменный то я его .* И обозначил)
Ну а в 4м случае - тоже самое что и в начале строки.
Может как то так:
Код:

"^(.*?)(.*shablon)(.*?)$"

shisik 21-06-2017 02:10 2746215

blackeangel, а что мешает просто использоват шаблон и ничего лишнего? Вообще нужна конкретика, так задача не понятна.

Iska 21-06-2017 06:20 2746224

Цитата:

Цитата shisik
Вообще нужна конкретика, так задача не понятна. »

Угу. Не видим образцов строк, из которых нужно что-то получить, и не видим, что именно нужно получить.

greg zakharov 21-06-2017 08:25 2746233

Видимо автор темы считает, что все с ним на одной волне, а потому вполне могут телепатировать что же он там хочет найти.

blackeangel 21-06-2017 09:37 2746246

shisik, Iska, greg zakharov,
Мужики, это ж задача из разряда универсальных. Ну если вам надо на основании чего то, то тогда давай те на основе моих данных
Скрытый текст

Вначале строки
Код:

drwxr-xr-x 0/0              0 2017-04-01 09:15 /system/app/
drwxr-xr-x 0/0              0 2017-03-30 20:52 /system/app/AnalyticsCore/
-rw-r--r-- 0/0            4635 2017-03-02 07:30 /system/app/AnalyticsCore/AnalyticsCore.apk
drwxr-xr-x 0/0              0 2017-03-30 20:52 /system/app/AnalyticsCore/oat/
drwxr-xr-x 0/0              0 2017-03-30 20:52 /system/app/AnalyticsCore/oat/arm64/
-rw-r--r-- 0/0          742144 2017-03-02 07:30 /system/app/AnalyticsCore/oat/arm64/AnalyticsCore.odex
drwxr-xr-x 0/0              0 2017-03-30 20:52 /system/app/AntHalService/
-rw-r--r-- 0/0          11669 2017-03-02 07:30 /system/app/AntHalService/AntHalService.apk
drwxr-xr-x 0/0              0 2017-03-30 20:52 /system/app/AntHalService/oat/
drwxr-xr-x 0/0              0 2017-03-30 20:52 /system/app/AntHalService/oat/arm64/
-rw-r--r-- 0/0          62208 2017-03-02 07:30 /system/app/AntHalService/oat/arm64/AntHalService.odex
drwxr-xr-x 0/0              0 2017-03-30 20:52 /system/app/AntiSpam/
-rw-r--r-- 0/0        3499207 2017-03-02 07:30 /system/app/AntiSpam/AntiSpam.apk
drwxr-xr-x 0/0              0 2017-03-30 20:52 /system/app/AntiSpam/oat/
drwxr-xr-x 0/0              0 2017-03-30 20:52 /system/app/AntiSpam/oat/arm64/
-rw-r--r-- 0/0        1487616 2017-03-02 07:30 /system/app/AntiSpam/oat/arm64/AntiSpam.odex
drwxr-xr-x 0/0              0 2017-03-30 20:52 /system/app/AppIndexProvider/
-rw-r--r-- 0/0          12047 2017-03-02 07:30 /system/app/AppIndexProvider/AppIndexProvider.apk
drwxr-xr-x 0/0              0 2017-03-30 20:52 /system/app/AppIndexProvider/oat/
drwxr-xr-x 0/0              0 2017-03-30 20:52 /system/app/AppIndexProvider/oat/arm64/
-rw-r--r-- 0/0          131840 2017-03-02 07:30 /system/app/AppIndexProvider/oat/arm64/AppIndexProvider.odex
drwxr-xr-x 0/0              0 2017-03-30 20:52 /system/app/ApplicationsProvider/
-rw-r--r-- 0/0          17260 2017-03-02 07:30 /system/app/ApplicationsProvider/ApplicationsProvider.apk
drwxr-xr-x 0/0              0 2017-03-30 20:52 /system/app/ApplicationsProvider/oat/
drwxr-xr-x 0/0              0 2017-03-30 20:52 /system/app/ApplicationsProvider/oat/arm64/
-rw-r--r-- 0/0          62208 2017-03-02 07:30 /system/app/ApplicationsProvider/oat/arm64/ApplicationsProvider.odex
drwxr-xr-x 0/0              0 2017-03-30 20:52 /system/app/AutoTest/
-rw-r--r-- 0/0          38135 2017-03-02 07:30 /system/app/AutoTest/AutoTest.apk
drwxr-xr-x 0/0              0 2017-03-30 20:52 /system/app/AutoTest/oat/
drwxr-xr-x 0/0              0 2017-03-30 20:52 /system/app/AutoTest/oat/arm64/
-rw-r--r-- 0/0          25344 2017-03-02 07:30 /system/app/AutoTest/oat/arm64/AutoTest.odex
drwxr-xr-x 0/0              0 2017-03-30 20:52 /system/app/Bluetooth/
-rw-r--r-- 0/0          565609 2017-03-02 07:30 /system/app/Bluetooth/Bluetooth.apk

в середине строки
Код:

0/0              0 2017-04-01 09:15 drwxr-xr-x /system/app
 0/0              0 2017-03-30 20:52 drwxr-xr-x /system/app/AnalyticsCore
 0/0            4635 2017-03-02 07:30 drwxr-xr-x /system/app/AnalyticsCore/AnalyticsCore.apk
 0/0              0 2017-03-30 20:52 drwxr-xr-x /system/app/AnalyticsCore/oat
 0/0              0 2017-03-30 20:52 drwxr-xr-x /system/app/AnalyticsCore/oat/arm64
 0/0          742144 2017-03-02 07:30 drwxr-xr-x /system/app/AnalyticsCore/oat/arm64/AnalyticsCore.odex
 0/0              0 2017-03-30 20:52 drwxr-xr-x /system/app/AntHalService
 0/0          11669 2017-03-02 07:30 drwxr-xr-x /system/app/AntHalService/AntHalService.apk
 0/0              0 2017-03-30 20:52 drwxr-xr-x /system/app/AntHalService/oat
 0/0              0 2017-03-30 20:52 drwxr-xr-x /system/app/AntHalService/oat/arm64
 0/0          62208 2017-03-02 07:30 drwxr-xr-x /system/app/AntHalService/oat/arm64/AntHalService.odex
 0/0              0 2017-03-30 20:52 drwxr-xr-x /system/app/AntiSpam
 0/0        3499207 2017-03-02 07:30 drwxr-xr-x /system/app/AntiSpam/AntiSpam.apk
 0/0              0 2017-03-30 20:52 drwxr-xr-x /system/app/AntiSpam/oat
 0/0              0 2017-03-30 20:52 drwxr-xr-x /system/app/AntiSpam/oat/arm64
 0/0        1487616 2017-03-02 07:30 drwxr-xr-x /system/app/AntiSpam/oat/arm64/AntiSpam.odex
 0/0              0 2017-03-30 20:52 drwxr-xr-x /system/app/AppIndexProvider
 0/0          12047 2017-03-02 07:30 drwxr-xr-x /system/app/AppIndexProvider/AppIndexProvider.apk
 0/0              0 2017-03-30 20:52 drwxr-xr-x /system/app/AppIndexProvider/oat
 0/0              0 2017-03-30 20:52 drwxr-xr-x /system/app/AppIndexProvider/oat/arm64
 0/0          131840 2017-03-02 07:30 drwxr-xr-x /system/app/AppIndexProvider/oat/arm64/AppIndexProvider.odex
 0/0              0 2017-03-30 20:52 drwxr-xr-x /system/app/ApplicationsProvider
 0/0          17260 2017-03-02 07:30 drwxr-xr-x /system/app/ApplicationsProvider/ApplicationsProvider.apk
 0/0              0 2017-03-30 20:52 drwxr-xr-x /system/app/ApplicationsProvider/oat
 0/0              0 2017-03-30 20:52 drwxr-xr-x /system/app/ApplicationsProvider/oat/arm64
 0/0          62208 2017-03-02 07:30 drwxr-xr-x /system/app/ApplicationsProvider/oat/arm64/ApplicationsProvider.odex
 0/0              0 2017-03-30 20:52 drwxr-xr-x /system/app/AutoTest
 0/0          38135 2017-03-02 07:30 drwxr-xr-x /system/app/AutoTest/AutoTest.apk
 0/0              0 2017-03-30 20:52 drwxr-xr-x /system/app/AutoTest/oat
 0/0              0 2017-03-30 20:52 drwxr-xr-x /system/app/AutoTest/oat/arm64
 0/0          25344 2017-03-02 07:30 drwxr-xr-x /system/app/AutoTest/oat/arm64/AutoTest.odex

вконце строки
Код:

0/0              0 2017-04-01 09:15 /system/app/ drwxr-xr-x
 0/0              0 2017-03-30 20:52 /system/app/AnalyticsCore/ drwxr-xr-x
 0/0            4635 2017-03-02 07:30 /system/app/AnalyticsCore/AnalyticsCore.apk -rw-r--r--
 0/0              0 2017-03-30 20:52 /system/app/AnalyticsCore/oat/ drwxr-xr-x
 0/0              0 2017-03-30 20:52 /system/app/AnalyticsCore/oat/arm64/ drwxr-xr-x
 0/0          742144 2017-03-02 07:30 /system/app/AnalyticsCore/oat/arm64/AnalyticsCore.odex -rw-r--r--
 0/0              0 2017-03-30 20:52 /system/app/AntHalService/ drwxr-xr-x
 0/0          11669 2017-03-02 07:30 /system/app/AntHalService/AntHalService.apk -rw-r--r--
 0/0              0 2017-03-30 20:52 /system/app/AntHalService/oat/ drwxr-xr-x
 0/0              0 2017-03-30 20:52 /system/app/AntHalService/oat/arm64/ drwxr-xr-x
 0/0          62208 2017-03-02 07:30 /system/app/AntHalService/oat/arm64/AntHalService.odex -rw-r--r--
 0/0              0 2017-03-30 20:52 /system/app/AntiSpam/ drwxr-xr-x
 0/0        3499207 2017-03-02 07:30 /system/app/AntiSpam/AntiSpam.apk -rw-r--r--
 0/0              0 2017-03-30 20:52 /system/app/AntiSpam/oat/ drwxr-xr-x
 0/0              0 2017-03-30 20:52 /system/app/AntiSpam/oat/arm64/ drwxr-xr-x
 0/0        1487616 2017-03-02 07:30 /system/app/AntiSpam/oat/arm64/AntiSpam.odex -rw-r--r--
 0/0              0 2017-03-30 20:52 /system/app/AppIndexProvider/ drwxr-xr-x
 0/0          12047 2017-03-02 07:30 /system/app/AppIndexProvider/AppIndexProvider.apk -rw-r--r--
 0/0              0 2017-03-30 20:52 /system/app/AppIndexProvider/oat/ drwxr-xr-x
 0/0              0 2017-03-30 20:52 /system/app/AppIndexProvider/oat/arm64/ drwxr-xr-x
 0/0          131840 2017-03-02 07:30 /system/app/AppIndexProvider/oat/arm64/AppIndexProvider.odex -rw-r--r--
 0/0              0 2017-03-30 20:52 /system/app/ApplicationsProvider/ drwxr-xr-x
 0/0          17260 2017-03-02 07:30 /system/app/ApplicationsProvider/ApplicationsProvider.apk -rw-r--r--
 0/0              0 2017-03-30 20:52 /system/app/ApplicationsProvider/oat/ drwxr-xr-x
 0/0              0 2017-03-30 20:52 /system/app/ApplicationsProvider/oat/arm64/ drwxr-xr-x
 0/0          62208 2017-03-02 07:30 /system/app/ApplicationsProvider/oat/arm64/ApplicationsProvider.odex -rw-r--r--
 0/0              0 2017-03-30 20:52 /system/app/AutoTest/ drwxr-xr-x
 0/0          38135 2017-03-02 07:30 /system/app/AutoTest/AutoTest.apk -rw-r--r--
 0/0              0 2017-03-30 20:52 /system/app/AutoTest/oat/ drwxr-xr-x
 0/0              0 2017-03-30 20:52 /system/app/AutoTest/oat/arm64/ drwxr-xr-x
 0/0          25344 2017-03-02 07:30 /system/app/AutoTest/oat/arm64/AutoTest.odex -rw-r--r--


*все создано искусственно, так как никто не знает где что вылезет.
моя регулярка такая
Код:

"^(.*)(.*[r|-][w|-][x|-][r|-][w|-][x|-][r|-][w|-][x|-])(.*)$"
но она только на 2,3 пункт распространяется.
Шаблоном является что то вот такое
Код:

-rw-r--r--
в различных её вариантах

blackeangel 21-06-2017 09:54 2746250

shisik, моя задача состоит в том чтобы заменить этот шаблон на пересчитаные в числа эти буквы. Ну те кто знаком с Linux системами поймет.
Думал использовать replaceAll,но отказался от этой мысли, тк все равно надо читать файл в массив 2д.

Iska 21-06-2017 09:59 2746252

Цитата:

Цитата blackeangel
Мужики, это ж задача из разряда универсальных. »

blackeangel, для регулярных выражений не бывает универсальных задач. Шаблоны жёстко привязаны ко входному набору данных.

Цитата:

Цитата blackeangel
так как никто не знает где что вылезет. »

Отнюдь. Форматы вполне определены, надо просто их знать.

Ваша регулярка может быть такой:
Код:

[d-](?:[r-][w-][x-]){3}
Никаких привязок «в начале строки», «в середине строки», «в конце строки» в описанной Вами задаче делать не нужно.

WSH
Код:

Option Explicit

Dim objFSO
Dim objRegExp

Dim strFile

Dim arrContent
Dim strLine
Dim strPath

Set objFSO    = WScript.CreateObject("Scripting.FileSystemObject")
Set objRegExp = WScript.CreateObject("VBScript.RegExp")

objRegExp.Pattern = "[d-](?:[r-][w-][x-]){3}"

For Each strFile In Array("0001.txt", "0002.txt", "0003.txt")
        WScript.Echo strFile
       
        With objFSO.OpenTextFile(strFile)
                arrContent = Split(.ReadAll(), vbCrLf)
                .Close
        End With
       
        For Each strLine In arrContent
                If objRegExp.Test(strLine) Then
                        WScript.Echo objRegExp.Execute(strLine).Item(0).Value
                End If
        Next
Next

Set objRegExp = Nothing
Set objFSO    = Nothing

WScript.Quit 0



Если там, как писалось ранее, может быть l вместо d или - — добавьте в шаблон.

greg zakharov 21-06-2017 10:03 2746254

blackeangel, Ваш поток сознания трудно понять.
Цитата:

Цитата blackeangel
Шаблоном является что то вот такое

А конкретней? Как понимать сие: искать строки начинающиеся с -rw-r--r--? Ежели так:
Код:

^(-r[w|-]?){3}.*$'
Цитата:

Цитата blackeangel
моя задача состоит в том чтобы заменить этот шаблон на пересчитаные в числа эти буквы

Бамо фучачо, адьос амигос, ибо дринк кальвадос. Еще раз - четко сформулируйте конечную цель и не взахлеб, а с чуством и расстановкой: что, куда, зачем?

Iska 21-06-2017 10:06 2746256

greg zakharov, он хочет в произвольной строке а) найти заведомо однократно встречающийся перечень прав, б) перевести полученное шаблоном символьное значение в число и в) по тому же шаблону заменить найденное значение на посчитанное. Строго говоря, найти и заменить один вид вот этого: File system permissions - Wikipedia на другой.

blackeangel 21-06-2017 10:09 2746257

greg zakharov, без паники :)
код мой такой
Код:


public static String[] parsinganytextfile(String line) {
        ArrayList<String> result = new ArrayList<String>();
        Pattern pattern = Pattern.compile("^(.*)(.*[r|-][w|-][x|-][r|-][w|-][x|-][r|-][w|-][x|-])(.*)$");
        Matcher matcher = pattern.matcher(line);
        if (matcher.find()) {
            for (int i = 1; i <= matcher.groupCount(); ++i) {
                result.add(matcher.group(i));
            }
        }
        return result.toArray(new String[0]);
    }

    public static void RecalcRules() {
        String InputTextFile;
        JFileChooser fileopen = new JFileChooser();
        int ret = fileopen.showDialog(null, "Открыть файл");
        if (ret == JFileChooser.APPROVE_OPTION) {
            File file = fileopen.getSelectedFile();
            InputTextFile = file.getAbsolutePath();
        } else {
            return;
        }
        String OutTextFile = InputTextFile + "_new";
        //погнали
        String[][] TextMass = new String[0][];
        try {
            TextMass = Files.lines(Paths.get(InputTextFile))
                    .map(g -> parsinganytextfile(g))
                    .toArray(String[][]::new);
        } catch (IOException e) {
            e.printStackTrace();
        }
        for (int i = 0; i < TextMass.length; i++) {
            if (TextMass[0].length == 1) {
                Functions.writefile(OutTextFile, getDigits(TextMass[i][0].replace("s", "x")));
            }
            if (TextMass[0].length == 2) {
                    Functions.writefile(OutTextFile, getDigits(TextMass[i][0].replace("s", "x")) + " " + TextMass[i][1]);
            } else {
                Functions.writefile(OutTextFile, TextMass[i][0] + " " + getDigits(TextMass[i][1].replace("s", "x")) + " " + TextMass[i][2]);
            }
        }
    }

    public static String getDigits(String s) {
        if (!s.matches("^.*([r|-][w|-][x|-]){3}$")) {
            throw new IllegalArgumentException("Achtung!");
        }
        Function<String, String> rwxMapper = rwx -> String.valueOf(Integer.parseInt(rwx.replaceAll("[rwx]", "1").replaceAll("-", "0"), 2));
        return Arrays.stream(s.substring(s.length() - 9).split("(?<=\\G...)")).map(rwxMapper).collect(joining());
    }

Что делает: читает файл в двумерный массив, выодит из массива в новый файл заменяя уже пересчитыными значениями

Iska, бинго :) Но не факт что это тот способ верный.

greg zakharov 21-06-2017 10:14 2746261

Иными словами lp файла нужно привести к чмодному виду, то есть, например, -rw-rw-rw- = 666, так?

blackeangel 21-06-2017 10:18 2746265

greg zakharov, именно!

greg zakharov 21-06-2017 10:22 2746266

Тогда как на счет stat?
Код:

$ ls -l .bashrc
-rw-r--r-- 1 User 197121 7,3K янв 10 13:45 .bashrc

$ stat -c %a .bashrc
644


blackeangel 21-06-2017 10:26 2746269

greg zakharov, не вариант. Данные например берутся из архива tar.gz или ещё чего лучше.
А с ls даже связываться не хочу. Лучше уж
find /system -exec stat -c '%N %u %g %a' {} \;
Но эта другая история.
Вернёмся к нашим баранам про регулярку)

greg zakharov 21-06-2017 10:31 2746272

Пфф, и что? Данные из тарбола трудно что ли разобрать в самом потоке? Пустая работа - бог в помощь.

blackeangel 21-06-2017 10:35 2746277

greg zakharov, с таким подходом на 90% задач можете сказать: "нафиг вам это не нужно, найдите специалиста" ;)

Iska 21-06-2017 10:42 2746280

blackeangel, всё, что Вам нужно — определить шаблон для всех возможных вариантов выдачи набора прав, и только. Я не специалист по Unix, я могу ориентироваться только по указанным статьям в wiki. Посему Вам должно быть виднее, что где подставить в шаблон регулярного выражения.

greg zakharov 21-06-2017 10:49 2746287

blackeangel, акститесь, уважаемый! Есть три типа людей: те, кто делают, те, кто понимают что делают и те, кто понимают что делают, но делают рационально. К последнему типу Вы явно не относитесь.

blackeangel 25-06-2017 01:09 2747113

Так как мне никто не помог, кроме Iska - идеей, что уже весьма ценно, немного подумав, все таки решил реализовать идею с replaceAll. Получилось коротенечко. Кому интересно вот:
Код:

    //пересчет прав в любом текстовом файле -->
    public static void RecalcRules() {
        String InputTextFile;
        JFileChooser fileopen = new JFileChooser();
        int ret = fileopen.showDialog(null, "Открыть файл");
        if (ret == JFileChooser.APPROVE_OPTION) {
            File file = fileopen.getSelectedFile();
            InputTextFile = file.getAbsolutePath();
        } else {
            return;
        }
        String OutTextFile = InputTextFile + "_new";
        BufferedReader reader = null;
        try {
            reader = new BufferedReader(new FileReader(InputTextFile));
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        String line;
        Pattern pattern = Pattern.compile("[-|l|s|d|b|c|p]([r|-][w|-][x|-]){3}");
        try {
            while ((line = reader.readLine()) != null) {
                Matcher matcher = pattern.matcher(line);
                if (matcher.find()) {
                    line = line.replaceAll(matcher.group(), getDigits(matcher.group()));
                                        writefile(OutTextFile,line);
                }else{
                                  writefile(OutTextFile,line);
                }
            }
        } catch (IOException e1) {
            e1.printStackTrace();
        }
    }
    //пересчет прав в любом текстовом файле <--
//калькулятор прав
  public static String getDigits(String s) {
        if (!s.matches("^.*([r|-][w|-][x|-]){3}$")) {
            throw new IllegalArgumentException("Achtung!");
        }
        Function<String, String> rwxMapper = rwx -> String.valueOf(Integer.parseInt(rwx.replaceAll("[rwx]", "1").replaceAll("-", "0"), 2));
        return Arrays.stream(s.substring(s.length() - 9).split("(?<=\\G...)")).map(rwxMapper).collect(joining());
    }
//запись в файл
    public static void writefile(String FileName, String text) {
        PrintWriter writer = null;
        try {
            writer = new PrintWriter(new BufferedWriter(new FileWriter(FileName, true)));
        } catch (IOException e) {
            e.printStackTrace();
        }
        writer.print(text + "\n");
        writer.close();
    }



Время: 12:21.

Время: 12:21.
© OSzone.net 2001-