【求助】如何实现字符串不匹配时的操作

【求助】如何实现字符串不匹配时的操作

cat file
/mnt/d/ccc.doc
/getip.sh
/jojo/game.sh
/mnt/e/xxx.xls
/mnt/e/conf/httpd.conf
/ffff.gif
/db/aaaa.pic

想要做到一点:
1. 如果file 中没有字符串string 的话(不匹配), 则在文件末添加一行, 内容为string;
2. 如果file 中有字符串string 的话(匹配), 则把该行改为string ok

请问用sed 命令该怎么写      
sed 我没有方法
  grep 的我到有
  [CODE]liangke@liangke-desktop:/tmp$ cat file
/mnt/d/ccc.doc
/getip.sh
/jojo/game.sh
/mnt/e/xxx.xls
/mnt/e/conf/httpd.conf
/ffff.gif
/db/aaaa.pic

liangke@liangke-desktop:/tmp$ grep 'mnt' file
/mnt/d/ccc.doc
/mnt/e/xxx.xls
/mnt/e/conf/httpd.conf
liangke@liangke-desktop:/tmp$ echo $?
0

liangke@liangke-desktop:/tmp$ grep 'mntd' file
liangke@liangke-desktop:/tmp$ echo $?
1
liangke@liangke-desktop:/tmp$ [/CODE]      
复制内容到剪贴板
代码:
[color=blue]-(dearvoid@LinuxEden:tty3)-(~/tmp)-
[19341 0] #[/color] cat file
hello
world
[color=blue]-(dearvoid@LinuxEden:tty3)-(~/tmp)-
[19341 0] #[/color] cat file.sed
#!/bin/sed -f

/string/ {
    s/string/string ok/
    q
}

$ a\
string
[color=blue]-(dearvoid@LinuxEden:tty3)-(~/tmp)-
[19341 0] #[/color] cat file.sed
#!/bin/sed -f

/string/ {
    s/string/string ok/
    q
}

$ a\
string
[color=blue]-(dearvoid@LinuxEden:tty3)-(~/tmp)-
[19341 0] #[/color] sed -i -f file.sed file ; cat file
hello
world
string
[color=blue]-(dearvoid@LinuxEden:tty3)-(~/tmp)-
[19341 0] #[/color] sed -i -f file.sed file ; cat file
hello
world
string ok
[color=blue]-(dearvoid@LinuxEden:tty3)-(~/tmp)-
[19341 0] #[/color] o
      
file.sed 这样写也行:
复制内容到剪贴板
代码:
[color=blue]-(dearvoid@LinuxEden:tty3)-(~/tmp)-
[19341 0] #[/color] cat file.sed
#!/bin/sed -f

s/string/string ok/
t done

$ a\
string

:done
[color=blue]-(dearvoid@LinuxEden:tty3)-(~/tmp)-
[19341 0] #[/color] o
      
亮兄没达到LZ要求,呵
dearvoid的代码只在只有单行string时也会工作正常
在只运行1,2次时也正常
复制内容到剪贴板
代码:
[0 No.2058 huan@huan ~/tmp]$ sed -i -f file.sed txt; cat txt
hello
world
string

[0 No.2059 huan@huan ~/tmp]$ sed -i -f file.sed txt; cat txt
hello
world
string ok

[0 No.2060 huan@huan ~/tmp]$ sed -i -f file.sed txt; cat txt
hello
world
string ok ok
来个不伦不类的,结合楼上两个大大的想法
滥用 &&, || 了:)
复制内容到剪贴板
代码:
[0 No.2098 huan@huan ~/tmp]$ cat txt
hello
world

[0 No.2099 huan@huan ~/tmp]$ grep -q 'string.*ok' txt ||  { grep -q 'string' txt &&  sed -i 's/\(string\)/\1 ok/' txt || echo 'string' >> txt; }; cat txt
hello
world
string

[0 No.2100 huan@huan ~/tmp]$ grep -q 'string.*ok' txt ||  { grep -q 'string' txt &&  sed -i 's/\(string\)/\1 ok/' txt || echo 'string' >> txt; }; cat txt
hello
world
string ok

[0 No.2101 huan@huan ~/tmp]$ grep -q 'string.*ok' txt ||  { grep -q 'string' txt &&  sed -i 's/\(string\)/\1 ok/' txt || echo 'string' >> txt; }; cat txt
hello
world
string ok

[0 No.2102 huan@huan ~/tmp]$
当然
如果楼主说明有符合 '^string$' 这样的行
会简单些      
哎,刚才忙着配置ubuntu了,题目我都没有看完。      
重返ubu啦?
写个心得
发上ubuntu/debian版里呗

我现在定制ubuntu edgy
同时在写文档
过一阵贴上来      
自己没有摸索什么东西,因此没有心得:rolleyes:
现在理论上是在linux下,实际在windows下
ubu 很不错了,ff 也快了,可惜ff 不是很稳定,于是虚拟了一个deepxin xp,转了个圈圈。      
俺只是提供点儿思路,不是完整的解决方案       
非常感谢几位大大, 我要的就是思路。

对了, 还有一个问题请教:

如果我用C 程序调用SHELL, 想要得到SHELL 程序返回的变量值, 该怎么处理?