我需要将txt文件大写,但是当我尝试使用sed在任何标点符号后添加空格时,我发现了一些问题。例如:“Hello,World” - > “Hello,World”
我尝试了以下内容:
#!/bin/bash
if [ $# != 1 ]; then
echo "No parameter"
exit
fi
cp $1 $1.bak
ARCH1=/tmp/`basename $1`.$$
sed 's/[A-Z]*/\L&/g' $1 > $ARCH1
sed -i 's/^./\u&/' $ARCH1
sed 's/ */\ /g' $ARCH1 #Here I replace >= 2 spaces for 1
sed 's/, */, /g' $ARCH1
#These 2 lines don't work well
sed 's/. */. /g' $ARCH1
sed 's/; */; /g' $ARCH1
mv $ARCH1 $1
脚本不会崩溃,但输出不是我期望的那样。
答案 0 :(得分:0)
我相信你的脚本无法正常工作的原因是你忘了在几次通话中将-i
传递给sed,并且你还没有在正则表达式中逃脱.
,以便.
匹配任何角色。
我也相信,做一些你想要做的事情的简单方法是
sed -i.bak 's/[A-Z]*/\L&/g; s/\([.,;]\) */\1 /' "$1"
-i.bak
就地编辑文件并使用.bak
扩展名创建备份,而脚本只是
s/[A-Z]*/\L&/g # lower-case everything (I got that from your code)
s/\([.,;]\) */\1 / # replace spaces after period, comma or semicolon
下面
[.,;]
是字符集匹配句点,逗号或分号,\(stuff\)
会在群组中捕获stuff
以供日后使用,\1
是参考第一次此类捕获的后向参考。请注意,这是一种非常简单的方法。例如,如果您的文字包含省略号(...),则会在其上方跳华尔兹并将...
转换为. . .
,类似的警告适用于?!
等
答案 1 :(得分:0)
使用GNU sed:
$ echo "foo;BAR,BaZ.qux" | sed -r 's/[[:punct:]]+/& /g; s/[[:alnum:]]+/\L\u&/g'
Foo; Bar, Baz. Qux
\L
小写整个单词,然后\u
大写第一个字符。
有关正则表达式文档,请参阅regex(7)
手册页。