SED или что-то для удаления всего после первого пространства до '|'

У меня есть немного отрывка удара, я продолжаю работать:

$ stat --printf=%A\|%U\|%G\|%s\|%y\|%N'\n' /usr/src/linux-headers-4.4.0-124/zfs/cmd/zhack
drwxr-xr-x|root|root|4096|2018-05-17 05:54:49.361904361 -0600|'/usr/src/linux-headers-4.4.0-124/zfs/cmd/zhack

Дата довольно ужасна, таким образом, я хотел бы использовать sed (или безотносительно работ) для удаления всего после первого пространства до следующего |. Конечно, если stat команда может обычно печатать дату, которая работает также!

Любые подсказки для sed оспариваемый?

0
задан 23 May 2018 в 01:12

2 ответа

С bash

$ a=$(stat -c'%A|%U|%G|%s|%y|%N' /etc/profile) ; echo ${a/ *|/|}
-rw-r--r--|root|root|575|2017-09-22|'/etc/profile'

Это bashРасширение Параметра, более точно Замена Шаблона, видит man bash/EXPANSION/Parameter Расширение. Я также взял свободу упростить Вашу командную строку немного.

С awk

$ stat -c'%A|%U|%G|%s|%y|%N' /etc/profile | awk -v{O,}FS=\| '{sub(/ [^|]+/,"",$5)}1'
-rw-r--r--|root|root|575|2017-09-22|'/etc/profile'

Это немного длиннее, но на самом деле самое точное решение: Это изменяет явно пятое поле только так, чтобы пробелы в именах файлов и именах пользователей (ожидают неожиданное) не были проблемой. Сравните:

$ a="-rw-r--r--|ro ot|ro ot|575|2017-09-22 17:35:19.337510248 +0200|'/etc/pro fi|le'"
$ sed 's/ [^|]*//' <<<$a
-rw-r--r--|ro|ro ot|575|2017-09-22 17:35:19.337510248 +0200|'/etc/pro fi|le'
$ echo ${a/ *|/|}
-rw-r--r--|ro|le'
$ awk -v{O,}FS=\| '{sub(/ [^|]+/,"",$5)}1' <<<$a
-rw-r--r--|ro ot|ro ot|575|2017-09-22|'/etc/pro fi|le'

Имя пользователя не должно содержать панель | хотя – однако, Вы могли заботиться о той возможности также:

$ b=$(awk -F\| '{print NF-1}' <<<"ro||ot") # how many bars again?
$ a="-rw-r--r--|ro||ot|ro||ot|575|2017-09-22 17:35:19.337510248 +0200|'/etc/pro fi|le'"
$ awk -v{O,}FS=\| '{sub(/ [^|]+/,"",$'$((5+b*2))')}1' <<<$a
-rw-r--r--|ro||ot|ro||ot|575|2017-09-22|'/etc/pro fi|le'
2
ответ дан 29 October 2019 в 07:04

С sed:

$ stat --printf='%A|%U|%G|%s|%y|%N\n' /etc/profile | sed 's/ [^|]*//'
-rw-r--r--|root|root|575|2015-10-23|'/etc/profile'

Который просто заменяет пространство, сопровождаемое не -| символы ни с чем.

3
ответ дан 29 October 2019 в 07:04

Другие вопросы по тегам:

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