用sed标点符号后添加空格

时间:2018-06-02 16:01:46

标签: linux bash sed

我需要将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

脚本不会崩溃,但输出不是我期望的那样。

2 个答案:

答案 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)手册页。