分页: 2 / 4
Re: 请问这样的Shell脚本如何写?
发表于 : 2011-08-21 18:44
由 我就是我2
cat text1.txt
abcxdefgaxcdyeafgxyxabefght...
试试中文字符oh, yes. x
java is not good. yes !kkk
缺点: 此种方法在文件中出现“公正”时失效, 所以要取一个文本不曾出现过的字符串。
有什么好办法来记录换行
[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是高级货。没用过。

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
Re: 请问这样的Shell脚本如何写?
发表于 : 2011-08-22 15:59
由 我就是我2
那个语言表达有些问题,看不懂。
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"
使用引用,得处理边界问题。

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
把简单的东东写得复杂无比,还版权神马的。。。。

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
Re: 请问这样的Shell脚本如何写?
发表于 : 2011-08-24 2:13
由 fnan
练习完了,就写个简单的sed多行处理:
sed -r ':a;N;$!ba;$s/(^[^x]*x|y[^y]*$)//g' file.txt