我在变量中有以下字符串:
-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命令来执行此操作吗?
如果将其视为字符串操作的练习(忽略有关尝试可靠地解析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
假设-E
的sed
选项启用了扩展的正则表达式,那么您可以使用:
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 $variable
和echo "$variable"
之间的区别是多么关键-一种将所有空白序列等同于单个空格,另一种保留内部间距。并捕获输出,例如:
variable=$(ls -l 1*.zip)
保留分配中的间距(尤其是换行符)。因此,显示的sed
有适度的机会为您工作,但不确定,因为您未在发布此答案之前未回答所要求的说明。
正如其他人说的那样,您实际上不应该解析ls
输出。否则,将使用awk来打印出您感兴趣的列的一种虚拟方法:
awk '{print $6, $7, $8, $9 "\n" $15, $16, $17, $18}' <<< $your_variable