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

sh/bash/dash/ksh/zsh等Shell脚本
Drinkingisnotgood
帖子: 3
注册时间: 2011-08-19 13:00

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

#1

帖子 Drinkingisnotgood » 2011-08-19 13:02

想要一个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

不知好心人可以帮忙一下吗?
上次由 Drinkingisnotgood 在 2011-08-19 13:49,总共编辑 1 次。
头像
jarlyyn
帖子: 4671
注册时间: 2006-04-12 18:54
联系:

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

#2

帖子 jarlyyn » 2011-08-19 13:07

文件是单行还是多行?
Drinkingisnotgood
帖子: 3
注册时间: 2011-08-19 13:00

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

#3

帖子 Drinkingisnotgood » 2011-08-19 13:34

文件是多行的 不知如何寫
头像
jarlyyn
帖子: 4671
注册时间: 2006-04-12 18:54
联系:

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

#4

帖子 jarlyyn » 2011-08-19 14:28

等我找找,记得写过类似的代码
头像
jarlyyn
帖子: 4671
注册时间: 2006-04-12 18:54
联系:

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

#5

帖子 jarlyyn » 2011-08-19 14:30

原文档不变对么?
Drinkingisnotgood
帖子: 3
注册时间: 2011-08-19 13:00

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

#6

帖子 Drinkingisnotgood » 2011-08-19 14:44

原文档不变亦可
变动的另存新档
头像
我就是我2
帖子: 1215
注册时间: 2008-12-13 10:55
来自: the Earth
联系:

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

#7

帖子 我就是我2 » 2011-08-19 21:55

单行我知道。多行确实不会。哎。
cat tex1.txt
"abcxdefgaxcdyeafgxyxabefght..."
[bash]
i=`sed 's/x.*$/x/' tex1.txt`
j=`sed 's/^.*y/y/' tex1.txt`
echo $i $j|sed -e "s/$i//" -e "s/$j$//" tex1.txt[/bash]
能不能先并行(使用一个没有出现过特殊字符串作为结束标记),再分行?
cat tex1.txt
"abcxdefgaxcdyeafgxyxabefght..."
"fewewretgjkjk543yeafgxy4534ght..."
预期结果
defgaxcdyeafgxyxabefght..."
"fewewretgjkjk543yeafgx
[bash]#!/bin/bash
# 能不能先并行(使用一个没有出现过特殊字符串作为结束标记),再分行?
# "公平"就是传说中的标记
sed 's/$/公平/g' tex1.txt | tr -d '\n' | sed 's/公平$//'>file1.txt
i=`sed 's/x.*$/x/' file1.txt`
j=`sed 's/^.*y/y/' file1.txt`
echo $i $j | sed -e "s/$i//" -e "s/$j$//" file1.txt | sed 's/公平/\n/g' >out1.txt
[/bash]
苏东坡问佛印道:“人人皆念观世音菩萨,观世音菩萨念谁?”
佛印答道:“念观世音菩萨。”
苏东坡诧异:“为何亦念观世音菩萨?”
曰:“求人不如求己。”


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

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

#8

帖子 fnan » 2011-08-19 23:57

单文本可以是:
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 字符还是照抄?
bash不如perl精妙,学不到lisp的皮毛,远不够c++强悍,不过可以用。
头像
我就是我2
帖子: 1215
注册时间: 2008-12-13 10:55
来自: the Earth
联系:

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

#9

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

作为shell初学者,mark LS的先。有空再看看怎么回事。 :em06
苏东坡问佛印道:“人人皆念观世音菩萨,观世音菩萨念谁?”
佛印答道:“念观世音菩萨。”
苏东坡诧异:“为何亦念观世音菩萨?”
曰:“求人不如求己。”


dropbox 誰好奇,誰來點
勞碌一生又如何,虛度一生又如何,你過得開心嗎?人活著就要開心嘛!
头像
xiajing
帖子: 30
注册时间: 2009-06-10 21:52

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

#10

帖子 xiajing » 2011-08-20 15:41

代码: 全选

sed -n '/x/,$ p' text?.txt | sed -n '{1h;2,$H;/y/{g;p;n;h}}' |sed -e '1s/x/\n/'|sed '1d'|sed   '$s/\(.*\)y.*/\1/'

sed -n '/x/,$ p' text?.txt | sed -n '{1h;2,$H;/y/{g;p;n;h}}' |sed -e '1s/x/\n/'|sed '1d'|sed '$s/\(.*\)y.*/\1/'



一行可以有完整的多个x或y,x和y也可以出现在多行,但假如x是“excellent"则“ex\ncellent"等跨行的情况不能处理。
代码简介:
1.选择从第一个x到文件结尾的文本。
2.从第一个x开始,遇到第一个y然后打印之前到第一行的内容,以后遇到一个y就打印到前一个y的内容,这样就确定了第一个x的行和最后一个y的行及之间的内容。
3.然后删除第一行的第一个x(及以前的内容)和最后一行的最后一个y(及以后的内容)就可以了。
fnan
帖子: 919
注册时间: 2009-07-01 22:04

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

#11

帖子 fnan » 2011-08-21 5:57

kose5@kose5-Aspire-4552:~$ cat -n 2
1 rsfgrgrghrh
2 sdxxdfxdfdf
3 lksokolxkxk
4 ydcchhfdydy
5 dyfhdydf
6 ddfdedfd
kose5@kose5-Aspire-4552:~$ cat 2|sed '/x/!d;t;s/^[^x]*//;:a;n;ba' 2 |tac| sed '/y/!d;t;s/\(.*\)y.*/\1/;:a;n;ba'|tac
xxdfxdfdf
lksokolxkxk
ydcchhfdydy
dyfhd
kose5@kose5-Aspire-4552:~$ cat 2|sed -n '/x/,$ p' | sed -n '{1h;2,$H;/y/{g;p;n;h}}' |sed -e '1s/x/\n/'|sed '1d'|sed '$s/\(.*\)y.*/\1/'
xdfxdfdf #好像多删除了一个x
lksokolxkxk
ydcchhfdyd #这不是最后有y的行
kose5@kose5-Aspire-4552:~$
还是我理解错lz的意思?
bash不如perl精妙,学不到lisp的皮毛,远不够c++强悍,不过可以用。
fnan
帖子: 919
注册时间: 2009-07-01 22:04

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

#12

帖子 fnan » 2011-08-21 6:00

kose5@kose5-Aspire-4552:~$ cat 2|sed '/x/!d;t;s/^[^x]*x//;:a;n;ba' 2 |tac| sed '/y/!d;t;s/\(.*\)y.*/\1/;:a;n;ba'|tac
xdfxdfdf #是理解错了,第一个x不留,改了下。
lksokolxkxk
ydcchhfdydy
dyfhd
bash不如perl精妙,学不到lisp的皮毛,远不够c++强悍,不过可以用。
fnan
帖子: 919
注册时间: 2009-07-01 22:04

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

#13

帖子 fnan » 2011-08-21 6:11

我就是我2 写了:作为shell初学者,mark LS的先。有空再看看怎么回事。 :em06
很简单的,开头没x行就删除,第一次遇到有x的那行就删除第一个x和前面的内容,后面的行通通打印,倒过来输入,没有y的行通通删除,第一次有y的行其实是最后有y的行,删除第一个y和之前的内容,再次倒过来输出就是最后的y和内容,多文本处理差不多的,不过不很清楚lz多文本处理要求。
(哪里不明白可以问的,我不保留版权)
(原来关键字的意思是一个词,有x或y的词可能跨行,再改改.)
(可是删除x和之前的内容,y和之后的内容,跨不跨行都一样的啊,不用改了 !)
bash不如perl精妙,学不到lisp的皮毛,远不够c++强悍,不过可以用。
头像
我就是我2
帖子: 1215
注册时间: 2008-12-13 10:55
来自: the Earth
联系:

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

#14

帖子 我就是我2 » 2011-08-21 8:58

fnan 写了:
我就是我2 写了:作为shell初学者,mark LS的先。有空再看看怎么回事。 :em06
很简单的,开头没x行就删除,第一次遇到有x的那行就删除第一个x和前面的内容,后面的行通通打印,倒过来输入,没有y的行通通删除,第一次有y的行其实是最后有y的行,删除第一个y和之前的内容,再次倒过来输出就是最后的y和内容,多文本处理差不多的,不过不很清楚lz多文本处理要求。
(哪里不明白可以问的,我不保留版权)
(原来关键字的意思是一个词,有x或y的词可能跨行,再改改.)
(可是删除x和之前的内容,y和之后的内容,跨不跨行都一样的啊,不用改了 !)
嗯嗯嗯。看到你使用tac的时候我就大约明白你的算法了,只是具体实现的时候那些sed的参数令我头大。

我前面的那个的算法是:多行转化成单行处理,再转成多行。
处理单行使用正则表达式的贪婪匹配。

代码: 全选

i=`sed 's/x.*$/x/' file1.txt`
j=`sed 's/^.*y/y/' file1.txt`
苏东坡问佛印道:“人人皆念观世音菩萨,观世音菩萨念谁?”
佛印答道:“念观世音菩萨。”
苏东坡诧异:“为何亦念观世音菩萨?”
曰:“求人不如求己。”


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

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

#15

帖子 fnan » 2011-08-21 10:04

sed -n '/x/,$ p' text1.txt| sed -n '/^[^y]*$/H;/y/{x;p};${/y/{g;};/^[^y]*$/{x;s/\n.*//};s/\(.*\)y.*/\1/p}' |sed '2s/x/\n/'|sed '1,2d'
比这种简单多了。
bash不如perl精妙,学不到lisp的皮毛,远不够c++强悍,不过可以用。
回复