带for循环并在bash shell中sed的分割字符串

问题描述 投票:0回答:2

我在变量中有以下字符串:

-rw-r--r-- 0 1068 1001 4870 Dec 6 11:58 1.zip -rw-r--r-- 0 1068 1001 20246 Dec 6 11:59 10.zip

我正在尝试使用for循环遍历此字符串并获得以下结果:

Dec 6 11:58 1.zip
Dec 6 11:59 10.zip

任何人都有适当的sed命令来执行此操作吗?

bash shell
2个回答
1
投票

如果将其视为字符串操作的练习(忽略有关尝试可靠地解析ls的输出的合理警告),则不需要sed。实际上,sed几乎绝对是该工作的错误工具-awk将是一个更好的选择-但是可以单独使用shell。例如,假设数据在字符串$variable中,则可以使用:

set -- $variable
echo  $6  $7  $8  $9
echo $15 $16 $17 $18

这将为您提供18个位置参数,并输出您感兴趣的8个。使用awk,您可以使用:

echo $variable | awk '{ print $6, $7, $8, $9; print $15, $16, $17, $18 }'

两者都会自动在空格处分割字符串,并允许您使用数字引用分割元素。使用sed,您不会获得自动拆分,这会使工作变得非常繁琐。

上面的代码假定$variable的内容是一行。假设变量实际上包含两行,因此

echo "$variable"

报告:

-rw-r--r-- 0 1068 1001  4870 Dec 6 11:58 1.zip
-rw-r--r-- 0 1068 1001 20246 Dec 6 11:59 10.zip

假设-Esed选项启用了扩展的正则表达式,那么您可以使用:

variable="-rw-r--r-- 0 1068 1001  4870 Dec 6 11:58 1.zip
-rw-r--r-- 0 1068 1001 20246 Dec 6 11:59 10.zip"
echo "$variable" |
sed -nE 's/^([^[:space:]]+[[:space:]]+){5}([^[:space:]]+([[:space:]]+[^[:space:]]+){3})$/\2/p'

这将查找一系列非空白字符,然后是一系列空白字符,重复5次,然后是一系列非空白字符和3组空白序列,然后是非白色序列空间。分组括号-因此,将字段1-5选入\1(将被忽略),将字段6-9选入\2(将保留),然后打印结果。如果您决定不使用任何制表符等,则可以将sed命令简化为:

echo "$variable" | sed -nE 's/^([^ ]+[ ]+){5}([^ ]+([ ]+[^ ]+){3})$/\2/p'

两者都产生输出:

Dec 6 11:58 1.zip
Dec 6 11:59 10.zip

处理输入的单行变体会令人发指-足够使我不再显示它。

请注意了解echo $variableecho "$variable"之间的区别是多么关键-一种将所有空白序列等同于单个空格,另一种保留内部间距。并捕获输出,例如:

variable=$(ls -l 1*.zip)

保留分配中的间距(尤其是换行符)。因此,显示的sed有适度的机会为您工作,但不确定,因为您未在发布此答案之前未回答所要求的说明。


0
投票

正如其他人说的那样,您实际上不应该解析ls输出。否则,将使用awk来打印出您感兴趣的列的一种虚拟方法:

awk '{print $6, $7, $8, $9 "\n" $15, $16, $17, $18}' <<< $your_variable
© www.soinside.com 2019 - 2024. All rights reserved.