Regex, удалить все символы после последнего возникновения «/»

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

[root@centos7 ~]# uptime
 19:53:40 up 13 days,  6:10,  1 user,  load average: 0.06, 0.13, 0.20
[root@centos7 ~]# 
[root@centos7 ~]# journalctl -b |head -1
-- Logs begin at Sat 2015-11-21 13:42:51 EST, end at Fri 2015-12-04 19:48:26 EST. --

Таким образом, это должно быть что-то особенное для вашей установки. Вы можете проверить, насколько велик файл журнала? Есть ли какие-либо настройки в вашей настройке для journalctl, такие как ограничения размера журнала? каков результат journalctl --disk-usage ?

РЕДАКТИРОВАТЬ: Вы увидите на своем хосте строку, похожую на приведенную ниже.После достижения пределов по умолчанию и отсутствия постоянного хранилища этот журнал удаляется, и journalctl -b может отображать только самые старые доступные сообщения журнала

Nov 21 13:43:27 xxxxxx-hostname systemd-journal[81]: Runtime journal is using 8.0M (max 74.8M, leaving 112.3M of free 740.6M, current limit 74.8M).
1
18.11.2018, 20:17
2 ответа
sed 's![^/]*$!!'

Это делает следующее:

  • Используйте разделитель, отличный от /, потому что регулярное выражение содержит /. (Мне нравятся !и |, потому что они выглядят как разделительные линии; другие люди используют @, #, ^или что-то другое, что им нравится. Можно использовать /в регулярном выражении, ограниченном /, но это может быть трудно для человека читать.)
  • Найти строку из (нуля или более )символов, отличных от /. (Делайте это как можно дольше. )Но он должен быть в конце строки.
  • И заменить его ничем.

Осторожно :строка ввода, которая не содержит символов /будет полностью уничтожен (т. е. будет удалено все содержимое строки, оставив только пустую строку ). Если бы мы хотели это исправить, и пусть строка без косых черт проходит без изменений, мы могли бы изменить команду на

sed 's!/[^/]*$!/!'

Это то же самое, что и первый ответ, за исключением того, что он соответствует последнему/ивсем символам после него, а затем заменяет их на /(, оставляя последний /во входной строке только ). Итак, где первый ответ находит one.txtи ничего не заменяет, это находит /one.txtи заменяет его на /. Но в строке, не содержащей символов /, первый ответ соответствует всей строке и ничем ее не заменяет, в то время как этот не нашел бы совпадения, и так бы не сделал замену.

Мы могли бы использовать /в качестве разделителя в этой команде, но тогда это должно быть

sed 's/\/[^/]*$/\//'

«экранирование» косых черт, являющихся частью регулярного выражения и строка замены предваряя их обратной косой чертой(\). Некоторые люди находят эти джунгли «наклонившихся деревьев» труднее читать и поддерживать, но в основном это сводится к вопросу стиля.

5
28.01.2020, 00:23

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

xargs -I {} dirname {} <file.txt

Это даст вам пути к каждому родительскому каталогу в списке. Для заданного списка это даст

/path/to/directory
/longer/path/to/some/directory
/path/with spaces/in/it

Чтобы вставить новую строку в путь, используйте

/some/path with a \
newline/in/it

И чтобы вставить кавычки, экранируйте их, например. \".

0
28.01.2020, 00:23

Теги

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