分页: 2 / 4

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

发表于 : 2011-08-21 18:44
我就是我2
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

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

发表于 : 2011-08-21 22:37
fnan
cat text1.txt|tr '\n' '\034'

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

发表于 : 2011-08-21 23:10
xiajing
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]

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

发表于 : 2011-08-21 23:22
eexpress
sed这样pxHy的。何必哦。
单行的,sed搞下。其他的,抛弃sed吧。

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

发表于 : 2011-08-22 0:50
我就是我2
eexpress 写了:sed这样pxHy的。何必哦。
单行的,sed搞下。其他的,抛弃sed吧。
那多行怎么搞,用什么工具好。那些pxHy是高级货。没用过。 :em06

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

发表于 : 2011-08-22 1:05
我就是我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么/?

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

发表于 : 2011-08-22 15:37
jarlyyn
http://www.fwolf.com/blog/post/346

我之前就是根据这个脚本改的,恩恩。

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

发表于 : 2011-08-22 15:59
我就是我2
jarlyyn 写了:http://www.fwolf.com/blog/post/346

我之前就是根据这个脚本改的,恩恩。
:em20
那个语言表达有些问题,看不懂。

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

发表于 : 2011-08-22 23:59
fnan
我就是我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不是必须的。

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

发表于 : 2011-08-23 0:51
我就是我2
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

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

发表于 : 2011-08-23 14:32
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' 这段参数的意思么?

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

发表于 : 2011-08-23 17:00
fnan
jarlyyn 写了:http://www.fwolf.com/blog/post/346

我之前就是根据这个脚本改的,恩恩。
把简单的东东写得复杂无比,还版权神马的。。。。 :em06

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

发表于 : 2011-08-23 17:13
fnan
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(即重复读入下一行又下一行,到最后一行)

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

发表于 : 2011-08-23 20:42
我就是我2
fnan 写了:
jarlyyn 写了:http://www.fwolf.com/blog/post/346

我之前就是根据这个脚本改的,恩恩。
把简单的东东写得复杂无比,还版权神马的。。。。 :em06
:em04 :em04 :em04

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

发表于 : 2011-08-24 2:13
fnan
练习完了,就写个简单的sed多行处理:
sed -r ':a;N;$!ba;$s/(^[^x]*x|y[^y]*$)//g' file.txt