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 в 11:12

4 ответа

С 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 / РАСШИРЕНИЕ / Расширение параметра.

С 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'

Это немного длиннее, но на самом деле самое точное решение: оно явно меняет пятое поле только для того, чтобы пробелы в именах файлов и пользователей ( bash 's Parameter Expansion ) не были проблемой. Compare:

$ 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'
3
ответ дан 8 June 2018 в 14:02

С 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
ответ дан 20 July 2018 в 13:46

с помощью sed:

[Ф1]

, который просто заменяет пробел, не-[Ф2] символы ни с чем.

3
ответ дан 8 June 2018 в 14:02
  • 1
    & Quot; просто & Quot; находится в руках кодера :). Выглядит неплохо. Имя файла может иметь пробел, но вряд ли будет иметь характер канала, поэтому я думаю, что теперь я в порядке. Благодарю. – WinEunuuchs2Unix 23 May 2018 в 04:45
  • 2
    @ WinEunuuchs2Unix оба случая не имеют значения, так как | всегда будет находиться между датой (которая также всегда включает пробел) и именем файла, используя формат, который вы указали. – muru 23 May 2018 в 04:46
  • 3
    Юп. Сценарий закончили. Скоро на экране рядом с вами. Я положу в кредит-ноте для вашего мудреца помочь СЭД. – WinEunuuchs2Unix 23 May 2018 в 05:34

С 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
ответ дан 17 July 2018 в 13:41

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

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