请问这样的Shell脚本如何写?

sh/bash/dash/ksh/zsh等Shell脚本
头像
我就是我2
帖子: 1215
注册时间: 2008-12-13 10:55
来自: the Earth
联系:

Re: 请问这样的Shell脚本如何写?

#16

帖子 我就是我2 » 2011-08-21 18:44

cat text1.txt
abcxdefgaxcdyeafgxyxabefght...
试试中文字符oh, yes. x
java is not good. yes !kkk
缺点: 此种方法在文件中出现“公正”时失效, 所以要取一个文本不曾出现过的字符串。 :em20 :em20
有什么好办法来记录换行 :em20 :em20
[bash]for i in text*.txt
do
sed -r 's/$/公正/g' $i | tr -d '\n' | grep -oP 'x.*y' | sed -e 's/^x//;s/y$//;s/公正/\n/g' >out-$i
done[/bash]

处理单行的方法 #贪婪的正则
grep -oP 'x.*y' text1.txt
sed -r 's/[^x]*x//;s/y[^y]*$//' text1.txt
苏东坡问佛印道:“人人皆念观世音菩萨,观世音菩萨念谁?”
佛印答道:“念观世音菩萨。”
苏东坡诧异:“为何亦念观世音菩萨?”
曰:“求人不如求己。”


dropbox 誰好奇,誰來點
勞碌一生又如何,虛度一生又如何,你過得開心嗎?人活著就要開心嘛!
fnan
帖子: 919
注册时间: 2009-07-01 22:04

Re: 请问这样的Shell脚本如何写?

#17

帖子 fnan » 2011-08-21 22:37

cat text1.txt|tr '\n' '\034'
bash不如perl精妙,学不到lisp的皮毛,远不够c++强悍,不过可以用。
头像
xiajing
帖子: 30
注册时间: 2009-06-10 21:52

Re: 请问这样的Shell脚本如何写?

#18

帖子 xiajing » 2011-08-21 23:10

Drinkingisnotgood 写了:想要一个shell 脚本 动作是:
1.依序读入一个文字档 tex1.txt ~ text9.txt:
tex1.txt 内容:
"abcxdefgaxcdyeafgxyxabefght..."
(文件是多行的
需要判断的关键字x y 可能是跨行)
2.删除档案中第1个x之前的内容(含x删除)

3.删除档案中最後一个y以後的内容(含y删除)

4.取得动作2 3 後所得档案 的 x 和 y 之间的文字 另存新档

得到 t1.txt ~ t9.txt

不知好心人可以帮忙一下吗?
方法二
[bash]sed -n '/x/,$p' tex?.txt | sed -e '1s/x/\n/'|sed '1d'| sed -n '1,${1h;2,$H;${g;s/\(^.*\)y.*/\1/;p}}' [/bash]
头像
eexpress
帖子: 58428
注册时间: 2005-08-14 21:55
来自: 长沙

Re: 请问这样的Shell脚本如何写?

#19

帖子 eexpress » 2011-08-21 23:22

sed这样pxHy的。何必哦。
单行的,sed搞下。其他的,抛弃sed吧。
● 鸣学
头像
我就是我2
帖子: 1215
注册时间: 2008-12-13 10:55
来自: the Earth
联系:

Re: 请问这样的Shell脚本如何写?

#20

帖子 我就是我2 » 2011-08-22 0:50

eexpress 写了:sed这样pxHy的。何必哦。
单行的,sed搞下。其他的,抛弃sed吧。
那多行怎么搞,用什么工具好。那些pxHy是高级货。没用过。 :em06
苏东坡问佛印道:“人人皆念观世音菩萨,观世音菩萨念谁?”
佛印答道:“念观世音菩萨。”
苏东坡诧异:“为何亦念观世音菩萨?”
曰:“求人不如求己。”


dropbox 誰好奇,誰來點
勞碌一生又如何,虛度一生又如何,你過得開心嗎?人活著就要開心嘛!
头像
我就是我2
帖子: 1215
注册时间: 2008-12-13 10:55
来自: the Earth
联系:

Re: 请问这样的Shell脚本如何写?

#21

帖子 我就是我2 » 2011-08-22 1:05

经过多次修正
多谢fnan 提供代码
cat text1.txt|tr '\n' '\034'

代码: 全选

for i in text*.txt
do
cat $i | tr '\n' '\034' | grep -oP 'x.*y' | sed -e 's/^x//;s/y$//' | tr '\034' '\n' | tee out-$i
done
ps: lz发贴后,就没再来过了?怎么回事。MJ么/?
上次由 我就是我2 在 2011-08-22 16:01,总共编辑 1 次。
苏东坡问佛印道:“人人皆念观世音菩萨,观世音菩萨念谁?”
佛印答道:“念观世音菩萨。”
苏东坡诧异:“为何亦念观世音菩萨?”
曰:“求人不如求己。”


dropbox 誰好奇,誰來點
勞碌一生又如何,虛度一生又如何,你過得開心嗎?人活著就要開心嘛!
头像
jarlyyn
帖子: 4671
注册时间: 2006-04-12 18:54
联系:

Re: 请问这样的Shell脚本如何写?

#22

帖子 jarlyyn » 2011-08-22 15:37

http://www.fwolf.com/blog/post/346

我之前就是根据这个脚本改的,恩恩。
头像
我就是我2
帖子: 1215
注册时间: 2008-12-13 10:55
来自: the Earth
联系:

Re: 请问这样的Shell脚本如何写?

#23

帖子 我就是我2 » 2011-08-22 15:59

jarlyyn 写了:http://www.fwolf.com/blog/post/346

我之前就是根据这个脚本改的,恩恩。
:em20
那个语言表达有些问题,看不懂。
苏东坡问佛印道:“人人皆念观世音菩萨,观世音菩萨念谁?”
佛印答道:“念观世音菩萨。”
苏东坡诧异:“为何亦念观世音菩萨?”
曰:“求人不如求己。”


dropbox 誰好奇,誰來點
勞碌一生又如何,虛度一生又如何,你過得開心嗎?人活著就要開心嘛!
fnan
帖子: 919
注册时间: 2009-07-01 22:04

Re: 请问这样的Shell脚本如何写?

#24

帖子 fnan » 2011-08-22 23:59

我就是我2 写了:经过多次修正
多谢fnan 提供代码
cat text1.txt|tr '\n' '\034'

代码: 全选

for i in text*.txt
do
cat $i | tr '\n' '\034' | grep -oP 'x.*y' | sed -e 's/^x//;s/y$//' | tr '\034' '\n' | tee out-$i
done
ps: lz发贴后,就没再来过了?怎么回事。MJ么/?
cat $i | tr '\n' '\034' | sed 's/[^x]*x//;s/y[^y]*$//' | tr '\034' '\n' | tee out-$i #grep不是必须的。
bash不如perl精妙,学不到lisp的皮毛,远不够c++强悍,不过可以用。
头像
我就是我2
帖子: 1215
注册时间: 2008-12-13 10:55
来自: the Earth
联系:

Re: 请问这样的Shell脚本如何写?

#25

帖子 我就是我2 » 2011-08-23 0:51

cat $i | tr '\n' '\034' | sed 's/[^x]*x//;s/y[^y]*$//' | tr '\034' '\n' | tee out-$i #grep不是必须的。
中间的正则有点眼熟,原来我在16L 写过。
处理单行的方法 #贪婪的正则
grep -oP 'x.*y' text1.txt
sed -r 's/[^x]*x//;s/y[^y]*$//' text1.txt
现在我想使用引用,似乎可以了。

代码: 全选

sed  's/[^x]*x\(.*\)y[^y]*$/\1/' <<< "abcxiiiiiybca"
使用引用,得处理边界问题。 :em20
苏东坡问佛印道:“人人皆念观世音菩萨,观世音菩萨念谁?”
佛印答道:“念观世音菩萨。”
苏东坡诧异:“为何亦念观世音菩萨?”
曰:“求人不如求己。”


dropbox 誰好奇,誰來點
勞碌一生又如何,虛度一生又如何,你過得開心嗎?人活著就要開心嘛!
gwssgc
帖子: 7
注册时间: 2008-04-10 15:25

Re: 请问这样的Shell脚本如何写?

#26

帖子 gwssgc » 2011-08-23 14:32

fnan 写了:单文本可以是:
sed '/x/!d;t;s/^[^x]*//;:a;n;ba' text1.txt |tac| sed '/y/!d;t;s/\(.*\)y.*/\1/;:a;n;ba'|tac >t1.txt
不清楚多文本是否每本单独考虑。还是一起考虑,比如text1 和text2 都无x,是不是t1 和t2 就要 0 字符?text3 有x text4无x t4是0 字符还是照抄?
小弟刚看了几天shell脚本,你的大体的思路我对照下面的解释能看明白,但是具体到脚本上完全晕菜啊! 高手能给我讲讲 '/x/!d;t;s/^[^x]*//;:a;n;ba' 这段参数的意思么?
fnan
帖子: 919
注册时间: 2009-07-01 22:04

Re: 请问这样的Shell脚本如何写?

#27

帖子 fnan » 2011-08-23 17:00

jarlyyn 写了:http://www.fwolf.com/blog/post/346

我之前就是根据这个脚本改的,恩恩。
把简单的东东写得复杂无比,还版权神马的。。。。 :em06
bash不如perl精妙,学不到lisp的皮毛,远不够c++强悍,不过可以用。
fnan
帖子: 919
注册时间: 2009-07-01 22:04

Re: 请问这样的Shell脚本如何写?

#28

帖子 fnan » 2011-08-23 17:13

gwssgc 写了:
fnan 写了:单文本可以是:
sed '/x/!d;t;s/^[^x]*//;:a;n;ba' text1.txt |tac| sed '/y/!d;t;s/\(.*\)y.*/\1/;:a;n;ba'|tac >t1.txt
不清楚多文本是否每本单独考虑。还是一起考虑,比如text1 和text2 都无x,是不是t1 和t2 就要 0 字符?text3 有x text4无x t4是0 字符还是照抄?
小弟刚看了几天shell脚本,你的大体的思路我对照下面的解释能看明白,但是具体到脚本上完全晕菜啊! 高手能给我讲讲 '/x/!d;t;s/^[^x]*//;:a;n;ba' 这段参数的意思么?
/x/!d 有x的行就不删除(即无x就删除)
;t ;前面的命令执行(!d)了就继续读命令执行( 没x就中断,读下一行)
:a;记号a
n;读入下一行
ba 跳到记号a(即重复读入下一行又下一行,到最后一行)
bash不如perl精妙,学不到lisp的皮毛,远不够c++强悍,不过可以用。
头像
我就是我2
帖子: 1215
注册时间: 2008-12-13 10:55
来自: the Earth
联系:

Re: 请问这样的Shell脚本如何写?

#29

帖子 我就是我2 » 2011-08-23 20:42

fnan 写了:
jarlyyn 写了:http://www.fwolf.com/blog/post/346

我之前就是根据这个脚本改的,恩恩。
把简单的东东写得复杂无比,还版权神马的。。。。 :em06
:em04 :em04 :em04
苏东坡问佛印道:“人人皆念观世音菩萨,观世音菩萨念谁?”
佛印答道:“念观世音菩萨。”
苏东坡诧异:“为何亦念观世音菩萨?”
曰:“求人不如求己。”


dropbox 誰好奇,誰來點
勞碌一生又如何,虛度一生又如何,你過得開心嗎?人活著就要開心嘛!
fnan
帖子: 919
注册时间: 2009-07-01 22:04

Re: 请问这样的Shell脚本如何写?

#30

帖子 fnan » 2011-08-24 2:13

练习完了,就写个简单的sed多行处理:
sed -r ':a;N;$!ba;$s/(^[^x]*x|y[^y]*$)//g' file.txt
bash不如perl精妙,学不到lisp的皮毛,远不够c++强悍,不过可以用。
回复