LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1297|回复: 5

请教:正则表达式中的非?

[复制链接]
发表于 2006-2-17 16:46:16 | 显示全部楼层 |阅读模式
我现在碰到一个问题:我在 Windows 下用 WinEdt 编写的 tex 文档,由于 WinEdt 的自动换行,结果拿到 Linux 下发现“真的”换行了,原本 vi 对很长的行是自动换行的,而我也已经习惯了,现在原本的一行变成了几行,反而觉得混乱。

所以想用正则替换一下,但是好像 sed/awk 没有 ! 非语句吧,假设 ! 代表非,我期望用类似于:
awk 'BEGIN{RS=""; FS="\n"} {printf("%s\n\n", gensub(/(!\\.*)\n(!\\.*|!^$)/, "", "g"))}' include/sa_postfix.tex >tmp2.tex
这样的语句来替换文件中“所有在当前行不包含 \mark... 标记、在下一行不包含 \mark... 标记或空行的换行符”。

这应该怎么做?

谢谢。
发表于 2006-2-18 08:34:57 | 显示全部楼层
如果是想将象这样的文件

  1. abc
  2. ed
  3. fg

  4. aabbcc
  5. ddee
  6. ffgg

复制代码

变成

  1. abcdefg

  2. aabbccddeeffgg

复制代码

试试这个sed命令

  1. sed -n 'H;/^$/{x;s/\n//g;G;p;}'
复制代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-2-20 14:56:14 | 显示全部楼层
好像是不行。

关键现在好像不能替换行尾的换行符 \n。
  1. $ echo "$str"
  2. abc
  3. ed
  4. fg
  5. aabbcc
  6. ddee
  7. ffgg
  8. $ echo "$str" | sed -n '/^$/!{s/\n$//g};p'
  9. abc
  10. ed
  11. fg
  12. aabbcc
  13. ddee
  14. ffgg
复制代码

《sed & awk》中提到,“初始时,模式空间包含有单个输入行的备份”,不知道这个备份是否包含换行符?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-2-20 16:02:13 | 显示全部楼层
yongjian 兄的方案基本上还是可以,就是最后一段会丢失。比如:
[CODE[
$ cat tmp
st1-
st2-
st3

string4-
string5-
string6

test1-
test2-
test3

$ sed -n 'H;/^$/{x;s/\n//g;G;p;}' tmp
st1-st2-st3

string4-string5-string6

[/CODE]

我也用 python 试过,也是这个问题:
  1. #!/usr/bin/python
  2. import sys
  3. string = ''
  4. for line in sys.stdin:
  5.         if line != '\n':
  6.                 string += line.strip('\n')
  7.                 # print string
  8.         else:
  9.                 # print line
  10.                 print string + line
  11.                 string = ''
复制代码
回复 支持 反对

使用道具 举报

发表于 2006-2-21 04:03:34 | 显示全部楼层
Post by Chowroc
好像是不行。

关键现在好像不能替换行尾的换行符 \n。

  1. $ echo "$str"
  2. abc
  3. ed
  4. fg

  5. aabbcc
  6. ddee
  7. ffgg

  8. $ echo "$str" | sed -n '/^$/!{s/\n$//g};p'
  9. abc
  10. ed
  11. fg

  12. aabbcc
  13. ddee
  14. ffgg
复制代码


《sed & awk》中提到,“初始时,模式空间包含有单个输入行的备份”,不知道这个备份是否包含换行符?

I don't think you were using the same cmd as I provided...
回复 支持 反对

使用道具 举报

发表于 2006-2-21 04:07:07 | 显示全部楼层
Post by Chowroc
yongjian 兄的方案基本上还是可以,就是最后一段会丢失。比如:
[CODE[
$ cat tmp
st1-
st2-
st3

string4-
string5-
string6

test1-
test2-
test3

$ sed -n 'H;/^$/{x;s/\n//g;G;p;}' tmp
st1-st2-st3

string4-string5-string6

[/CODE]

我也用 python 试过,也是这个问题:

  1. #!/usr/bin/python

  2. import sys

  3. string = ''
  4. for line in sys.stdin:
  5.         if line != '\n':
  6.                 string += line.strip('\n')
  7.                 # print string
  8.         else:
  9.                 # print line
  10.                 print string + line
  11.                 string = ''
复制代码

Put a blank line at the end will just solve the problem. And its easy to do...
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表