分页: 1 / 4
请问这样的Shell脚本如何写?
发表于 : 2011-08-19 13:02
由 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
不知好心人可以帮忙一下吗?
Re: 请问这样的Shell脚本如何写?
发表于 : 2011-08-19 13:07
由 jarlyyn
文件是单行还是多行?
Re: 请问这样的Shell脚本如何写?
发表于 : 2011-08-19 13:34
由 Drinkingisnotgood
文件是多行的 不知如何寫
Re: 请问这样的Shell脚本如何写?
发表于 : 2011-08-19 14:28
由 jarlyyn
等我找找,记得写过类似的代码
Re: 请问这样的Shell脚本如何写?
发表于 : 2011-08-19 14:30
由 jarlyyn
原文档不变对么?
Re: 请问这样的Shell脚本如何写?
发表于 : 2011-08-19 14:44
由 Drinkingisnotgood
原文档不变亦可
变动的另存新档
Re: 请问这样的Shell脚本如何写?
发表于 : 2011-08-19 21:55
由 我就是我2
单行我知道。多行确实不会。哎。
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]
Re: 请问这样的Shell脚本如何写?
发表于 : 2011-08-19 23:57
由 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 字符还是照抄?
Re: 请问这样的Shell脚本如何写?
发表于 : 2011-08-20 7:20
由 我就是我2
作为shell初学者,mark LS的先。有空再看看怎么回事。

Re: 请问这样的Shell脚本如何写?
发表于 : 2011-08-20 15:41
由 xiajing
代码: 全选
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(及以后的内容)就可以了。
Re: 请问这样的Shell脚本如何写?
发表于 : 2011-08-21 5:57
由 fnan
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的意思?
Re: 请问这样的Shell脚本如何写?
发表于 : 2011-08-21 6:00
由 fnan
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
Re: 请问这样的Shell脚本如何写?
发表于 : 2011-08-21 6:11
由 fnan
我就是我2 写了:作为shell初学者,mark LS的先。有空再看看怎么回事。

很简单的,开头没x行就删除,第一次遇到有x的那行就删除第一个x和前面的内容,后面的行通通打印,倒过来输入,没有y的行通通删除,第一次有y的行其实是最后有y的行,删除第一个y和之前的内容,再次倒过来输出就是最后的y和内容,多文本处理差不多的,不过不很清楚lz多文本处理要求。
(哪里不明白可以问的,我不保留版权)
(原来关键字的意思是一个词,有x或y的词可能跨行,再改改.)
(可是删除x和之前的内容,y和之后的内容,跨不跨行都一样的啊,不用改了 !)
Re: 请问这样的Shell脚本如何写?
发表于 : 2011-08-21 8:58
由 我就是我2
fnan 写了:我就是我2 写了:作为shell初学者,mark LS的先。有空再看看怎么回事。

很简单的,开头没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`
Re: 请问这样的Shell脚本如何写?
发表于 : 2011-08-21 10:04
由 fnan
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'
比这种简单多了。