SED或者在第一个空格之后删除所有内容的东西,直到`|`
我有一个小bash片段我正在研究:
$ 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
任何提示sed
挑战吗?
随着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 Expansion 。 我也可以自由地简化命令行。
用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'
用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'
这只是替换了非|
后跟空格 什么都没有的人物