Показать полную графическую версию : Пересчет буквенных прав в цифровые в любом текстовом файле
blackeangel
21-06-2017, 00:03
Мучаюсь второй день, не могу понять как реализовать.
В общем надо написать одну регулярное выражение которое охватывало сразу 4 варианта нахождения шаблона в строке согласно его позиции
1) вначале строки
2) в середине строки
3)в конце строки
4) только шаблон
С 2м и 3м я сделал так
"^(.*)(.*shablon)(.*)$"
Но это не применимо к началу строки: отрывает первый символ что стоит у шаблона, он тоже нужен(но тк он переменный то я его .* И обозначил)
Ну а в 4м случае - тоже самое что и в начале строки.
Может как то так:
"^(.*?)(.*shablon)(.*?)$"
blackeangel, а что мешает просто использоват шаблон и ничего лишнего? Вообще нужна конкретика, так задача не понятна.
Вообще нужна конкретика, так задача не понятна. »
Угу. Не видим образцов строк, из которых нужно что-то получить, и не видим, что именно нужно получить.
greg zakharov
21-06-2017, 08:25
Видимо автор темы считает, что все с ним на одной волне, а потому вполне могут телепатировать что же он там хочет найти.
blackeangel
21-06-2017, 09:37
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
shisik, моя задача состоит в том чтобы заменить этот шаблон на пересчитаные в числа эти буквы. Ну те кто знаком с Linux системами поймет.
Думал использовать replaceAll,но отказался от этой мысли, тк все равно надо читать файл в массив 2д.
Мужики, это ж задача из разряда универсальных. »
blackeangel, для регулярных выражений не бывает универсальных задач. Шаблоны жёстко привязаны ко входному набору данных.
так как никто не знает где что вылезет. »
Отнюдь. Форматы вполне определены, надо просто их знать.
Ваша регулярка может быть такой:
[d-](?:[r-][w-][x-]){3}
Никаких привязок «в начале строки», «в середине строки», «в конце строки» в описанной Вами задаче делать не нужно.
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
blackeangel, Ваш поток сознания трудно понять.
Шаблоном является что то вот такоеА конкретней? Как понимать сие: искать строки начинающиеся с -rw-r--r--? Ежели так:
^(-r[w|-]?){3}.*$'
моя задача состоит в том чтобы заменить этот шаблон на пересчитаные в числа эти буквыБамо фучачо, адьос амигос, ибо дринк кальвадос. Еще раз - четко сформулируйте конечную цель и не взахлеб, а с чуством и расстановкой: что, куда, зачем?
greg zakharov, он хочет в произвольной строке а) найти заведомо однократно встречающийся перечень прав, б) перевести полученное шаблоном символьное значение в число и в) по тому же шаблону заменить найденное значение на посчитанное. Строго говоря, найти и заменить один вид вот этого: File system permissions - Wikipedia (https://en.wikipedia.org/wiki/File_system_permissions#Numeric_notation) на другой.
blackeangel
21-06-2017, 10:09
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
Иными словами lp файла нужно привести к чмодному виду, то есть, например, -rw-rw-rw- = 666, так?
blackeangel
21-06-2017, 10:18
greg zakharov, именно!
greg zakharov
21-06-2017, 10:22
Тогда как на счет 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
greg zakharov, не вариант. Данные например берутся из архива tar.gz или ещё чего лучше.
А с ls даже связываться не хочу. Лучше уж
find /system -exec stat -c '%N %u %g %a' {} \;
Но эта другая история.
Вернёмся к нашим баранам про регулярку)
greg zakharov
21-06-2017, 10:31
Пфф, и что? Данные из тарбола трудно что ли разобрать в самом потоке? Пустая работа - бог в помощь.
blackeangel
21-06-2017, 10:35
greg zakharov, с таким подходом на 90% задач можете сказать: "нафиг вам это не нужно, найдите специалиста" ;)
blackeangel, всё, что Вам нужно — определить шаблон для всех возможных вариантов выдачи набора прав, и только. Я не специалист по Unix, я могу ориентироваться только по указанным статьям в wiki. Посему Вам должно быть виднее, что где подставить в шаблон регулярного выражения.
greg zakharov
21-06-2017, 10:49
blackeangel, акститесь, уважаемый! Есть три типа людей: те, кто делают, те, кто понимают что делают и те, кто понимают что делают, но делают рационально. К последнему типу Вы явно не относитесь.
blackeangel
25-06-2017, 01:09
Так как мне никто не помог, кроме 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();
}
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.