2013-03-26 46 views
-1

我正在寻找一种方法来绕过读写文件。 是否有可能直接使用sed命令的结果?使用 #!/bin/sh,因为我使用NetBSD,sed -i不能正常工作,所以我必须使用sed -e,然后将结果重定向到文件。使用sed而不需要写入文件

结果命令disklabel xbd0

netbsd# disklabel xbd0 >/file ; 
# /dev/rxbd0d: 
type: unknown 
disk: xbd0 
label: 
flags: 
bytes/sector: 512 
sectors/track: 2048 
tracks/cylinder: 1 
sectors/cylinder: 2048 
cylinders: 1000 
total sectors: 2048000 
rpm: 3600 
interleave: 1 
trackskew: 0 
cylinderskew: 0 
headswitch: 0   # microseconds 
track-to-track seek: 0 # microseconds 
drivedata: 0 

16 partitions: 
#  size offset  fstype [fsize bsize cpg/sgs] 
a: 2048000   0  4.2BSD 1024 8192  0 # (Cyl.  0 - 999) 
c: 2048000   0  unused  0  0  # (Cyl.  0 - 999) 
d: 2048000   0  unused  0  0  # (Cyl.  0 - 999) 


netbsd# disklabel xbd0 | sed -e "s/match1/replace/" \ 
-e "s/match2/replace/" \ 
-e "s/match3/replace/" /file > /file.1 ; 

如何发送另一个命令里面的结果吗?

$ new_command -add $(results) 
+0

你们是不是重定向命令 的结果 “磁盘标签xbd0 | sed的-e ”S/MATCH1 /替换/“ \ -e ”S/MATCH2 /替换/“ \ -e” S/MATCH3 /替换/ “/文件”到/file.1? – 2013-03-26 14:59:18

回答

3

你已经成功地管道disklabel的结果sed。那么,为什么不把sed的结果传给任何new_command呢?

disklabel xbd0 | sed -e "s/match/replace/" | new_command 

例如,管sed将sort然后通过管道的输出,输出到grep

+1

如果new_command需要参数,管道将无法工作 – 2013-03-26 15:03:22

+0

是的,它会:只需添加参数(如果你知道它们在所有情况下都不依赖于disklabel或sed的输出):'disklabel xbd0 | sed -e“s/match/replace /”| new_command arg1 arg2'(管道将sed的结果发送给new_command的STDIN,与new_command的参数无关) – 2013-03-26 15:10:31

+0

@Stillakid当然可以。你的意思是它需要一个文件参数?这就是'/ dev/stdin'的用途。 – tchrist 2013-03-26 15:11:24

0

在您的代码中,您尝试将命令的输出重定向到/ file,您将获得“permission denied”权限,除非您以超级用户身份执行此操作。 要发送一个命令的结果给另一个命令,这样做:

command2 `command1` #if command2 needs output of command1 as an argument 

command2 $(command1) #if command2 needs output of command1 as an argument 
2

如何发送另一个命令里面的结果吗?作为$ new_command -add $(results)

如果这真的是你的意思,你可以用xarg命令实现这一点:

disklabel xbd0 | sed -e "s/match/replace/" | xargs new_command -add 

注意xargs会打破你输入的空格,如果你想探微一个大的说法,你可以使用xargs -0

最有可能最好设计new_command,以便它从stdin获取输入并通过辅助管传递此输入。

相关问题