Bash: манипулирование строками с помощью sed и регулярного выражения не работает: заменить строку на косую - PullRequest
0 голосов
/ 07 июня 2018

Надеюсь, вы мне поможете:

Вот одна из моих строк, которой я должен манипулировать со строкой:

./period/0.0.1/projectname/path/path/-rw-rw-r--filename.txt 2462

Где последнее число - размер файла, необходимый дляпоследующие вычисления.

Последовательность -rw-rw-r-- взята из выходного списка файлов, в котором я отделил файлы от каталогов и пропустил все строки, начинающиеся с "d".Теперь мне нужно избавиться от последовательности прав в строках.

Вот мое регулярное выражение, которое точно соответствует этой цели: [/][-][-rwx]{9,9} Я проверил tat с помощью средства проверки регулярных выражений и получил именно то, что я хочу: строка/ - включая следующие 9 символов.

Что я хочу: заменить эту строку "/ - включая следующие 9 символов" одной косой чертой /.Чтобы избежать побега, я использую трубу как разделитель в sed.Следующая команда sed работает правильно:

sed 's|teststring|/|g' inputfile > outputfile

Проблема:

Когда я заменяю "testtring" на мое регулярное выражение, он ничего не манипулирует:

sed 's|[/][-][-rwx]{9,9}|/|g' inputfile > outputfile

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

Что я здесь не так делаю ??

Ответы [ 3 ]

0 голосов
/ 07 июня 2018

Вы можете использовать

sed 's|/-[-rwx]\{9\}|/|g'

Обратите внимание, что в шаблонах POSIX BRE, чтобы указать ограничивающий квантификатор, вам необходимо экранировать фигурные скобки.

См. Демонстрационную версию Bash:

s='./period/0.0.1/projectname/path/path/-rw-rw-r--filename.txt 2462'
echo $s | sed 's|/-[-rwx]\{9\}|/|g'

Вывод:

./period/0.0.1/projectname/path/path/filename.txt 2462

ПРИМЕЧАНИЕ : Не рекомендуется заключать в скобки каждый отдельный символ с выражением в скобках, [/] = / и [-] = -.

0 голосов
/ 07 июня 2018

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

Либо избегайте их:

sed 's|[/][-][-rwx]\{9,9\}|/|g' inputfile > outputfile

Или переключитесь на ERE:

sed -n 's|[/][-][-rwx]{9,9}|/|g' inputfile > outputfile # for GNU sed
sed -E 's|[/][-][-rwx]{9,9}|/|g' inputfile > outputfile # for BSD sed & modern GNU sed

В качестве примечания, ваше регулярное выражение может быть упрощено до /-[-rwx]{9}:

sed -E 's|/-[-rwx]{9}|/|g' inputfile > outputfile
0 голосов
/ 07 июня 2018

Вы можете использовать это sed с расширенным регулярным выражением:

sed -E 's|/-[-rwx]{9}|/|g' file

./period/0.0.1/projectname/path/path/filename.txt 2462
  • Нет необходимости использовать [/] и [-] в вашем регулярном выражении
  • Используйте -E для расширенного сопоставления регулярных выражений
  • .{9,9} совпадает с .{9}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...