Chinaunix
标题:
ed替换行字串
[打印本页]
作者:
waterun
时间:
2004-03-25 20:04
标题:
ed替换行字串
请问一下如何替换行中字串,文件如下。
Solaris%pg file
123
23412
abc
24234
abc
234232
想用ed命令替换把第三行的abc替换成def,命令如下。
Solaris%ed file
27
1/abc/s//shell/g
?
q
Solaris%
失败,没有改变,请帮忙。可能有朋友问我用vi就可以了,干嘛这么麻烦。因为我要写一个shell,其中要对文件每行解析,匹配的行以下的三行需要替换。比如文件如下:
...
342
123
Line1
Line2
Line3
abcd
1231
...
匹配123,需要把Line1,Line2,Line3用abc,def,ghi分别替换,所以要一行一行读文件,用一个变量记录行数,匹配123的,用ed命令替换。vi不会,而且屏幕会很乱。不想重写文件,如sed重定向到另外一个文件,想直接改。谢谢您的回复!
作者:
bjgirl
时间:
2004-03-26 01:25
标题:
ed替换行字串
$cat file
123
23412
abc
234234
abc
234232
$ed -p: file
36
:3d #删除第3行
:2a #在第2行后插入要替换的字符
def
. #切换都命令模式
:w #写盘退出
36
:q
$cat file
123
23412
def
234234
abc
234232
复制代码
刚刚看了看ed的简单用法,听有趣的@_@,sorry,只会这些..
ps:AD版主的ed用的特棒
怎么好几天没见他啦
作者:
waterun
时间:
2004-03-26 10:24
标题:
ed替换行字串
十分感谢bjgirl,结果完全正确。另外再请教一下吧,呵呵,由于我要用shell,所以要传行数。
Solaris%pg file
123
abc
123
Solaris%pg test.sh
#!/bin/sh
LineNo=0
InsertLine=0
NewStr="test"
exec<file
while read LINE
do
echo $LINE
LineNo=`expr $LineNo + 1`
if [ "$LINE" = "abc" ] ; then
InsertLine=`expr $LineNo - 1`
ed -p: file<<!
“$LineNo”d #删除abc行
“$InsertLine”a #在123后添加新行
“$NewStr” #输入新行
.
w
q
!
fi
done
exec < /dev/tty
复制代码
test.sh运行失败,这里shell中使用ed时如何解读传入的变量呢?再次感谢您的回复。
作者:
nkoldbug
时间:
2004-03-26 11:23
提示:
作者被禁止或删除 内容自动屏蔽
作者:
waterun
时间:
2004-03-26 12:03
标题:
ed替换行字串
谢谢nkoldbug,3c表示替换第三行,如果在shell中用变量表示替换行数,如何编码呢?
我尝试过以下几种方法
Line=3
...
`$Line`c
或者
“$Line”c
或者
‘$Line’c
或者
\$Line\c
都失败,能否帮忙,谢谢您的回复。
作者:
waterun
时间:
2004-03-26 13:00
标题:
ed替换行字串
问题解决了,首先感谢bjgirl和nkoldbug的帮助。下面的shell是把指定的字串下面六行替换掉。
Solaris%pg file
123
<section>
1 - Line1: ~!@#$%^&*()_+|}{":?><MNBVCvbnmlkjhgfdpoiuytrewq
1 - Line2: ~!@#$%^&*()_+|}{":?><MNBVCvbnmlkjhgfdpoiuytrewq
1 - Line3: ~!@#$%^&*()_+|}{":?><MNBVCvbnmlkjhgfdpoiuytrewq
1 - Line4: ~!@#$%^&*()_+|}{":?><MNBVCvbnmlkjhgfdpoiuytrewq
1 - Line5: ~!@#$%^&*()_+|}{":?><MNBVCvbnmlkjhgfdpoiuytrewq
1 - Line6: ~!@#$%^&*()_+|}{":?><MNBVCvbnmlkjhgfdpoiuytrewq
234
345
aeerte
<section>
1 - Line1: ~!@#$%^&*()_+|}{":?><MNBVCvbnmlkjhgfdpoiuytrewq
1 - Line2: ~!@#$%^&*()_+|}{":?><MNBVCvbnmlkjhgfdpoiuytrewq
1 - Line3: ~!@#$%^&*()_+|}{":?><MNBVCvbnmlkjhgfdpoiuytrewq
1 - Line4: ~!@#$%^&*()_+|}{":?><MNBVCvbnmlkjhgfdpoiuytrewq
1 - Line5: ~!@#$%^&*()_+|}{":?><MNBVCvbnmlkjhgfdpoiuytrewq
1 - Line6: ~!@#$%^&*()_+|}{":?><MNBVCvbnmlkjhgfdpoiuytrewq
123
abcd
Solaris%pg res.sh
#!/bin/ksh
# The six rows below fixed string <section> in file will be directly replaced
# by NewStr, so backup original is a recommended choice.
NewStr="test"
replace()
{
str=`echo $str | ed -p: file<<!
$LineNo
c
$NewStr
.
w
q
!`
}
main()
{
row=0
flag=0
LineNo=0
cp -p file file.bak
exec<file
while read LINE
do
#echo $LINE
LineNo=`expr $LineNo + 1`
if [ "$LINE" = "<section>" ] ; then
row=6
flag=1
continue
fi
if [ $flag -eq 1 ] && [ row -ne 0 ]; then
row=`expr $row - 1`
replace
fi
done
exec < /dev/tty
}
main
复制代码
再次感谢。
欢迎光临 Chinaunix (http://bbs.chinaunix.net/)
Powered by Discuz! X3.2