我正在尝试通过bash脚本清理超过120,000行的文本文件。我需要执行几次查找和替换。每次查找和替换的顺序很重要,文件需要“记住”先前的查找和替换。
示例:将所有'。'(句点)替换为'。\ n'(句点和换行符),然后
然后用'?\ n'(问号和换行符替换所有'?'(问号),然后
用'!\ n'(感叹号和换行符)替换所有'!'(句号),然后...等。
我正在这样做,但是不起作用:
#!/usr/bin/env bash
sed 's/./.\n/g'
sed 's/?/?\n/g'
sed 's/!/!\n/g'
input.txt
我在做什么错?
sed或awk对于我要达到的目标更好?
您可能总是通过管道传递sed
命令,但是在这种情况下,将所有条件组合成一个命令是有意义的:
sed 's/[.!?]/&\n/g' file > newfile
[.!?]
匹配替换模式中的.
,!
或?
和&
,将匹配值放回字符串中(在该值之后立即添加换行符。)>]
请参见online demo:
s="This is a text. Want more? Yes! End" sed 's/[.!?]/&\n/g' <<< "$s"
输出:
This is a text. Want more? Yes! End
如果需要删除
?
,!
和.
使用后的空格
sed 's/\([.!?]\)[[:space:]]*/\1\n/g' file > newfile
请参见another
sed
demo。在这里:
sed
-捕获组1:匹配\([.!?]\)
,.
或!
]?
-0或多个空格替换模式中的[[:space:]]*
是指捕获到组1中的值。