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' 

这只是替换了非|后跟空格 什么都没有的人物