7

在一个字符串中,我试图用下划线替换括号之间的所有空格。例如,假设this ( is my ) simple example我想得到this (_is_my_) simple example.

我正在研究 bash 并考虑为 sed 创建一个替换表达式,但是我无法想出一个简单的单行解决方案。

期待您的帮助

4

5 回答 5

6

使用 sed:

sed ':l s/\(([^ )]*\)[ ]/\1_/;tl' input

如果括号不平衡:

sed ':l s/\(([^ )]*\)[ ]\([^)]*)\)/\1_\2/;tl' input
于 2013-01-03T00:37:26.053 回答
2
$ cat file
this ( is my ) simple example
$ awk 'match($0,/\([^)]+\)/) {str=substr($0,RSTART,RLENGTH); gsub(/ /,"_",str); $0=substr($0,1,RSTART-1) str substr($0,RSTART+RLENGTH)} 1' file
this (_is_my_) simple example

如果模式可以在一行上多次出现,则将 match() 放入循环中。

于 2013-01-02T23:04:10.097 回答
0

使用真正的编程语言:

#!/usr/bin/python

import sys

for line in sys.stdin:
    inp = False
    for x in line:
        if x == '(':
            inp = True
        elif x == ')':
            inp = False
        if inp == True and x == ' ':
            sys.stdout.write('_')
        else:
            sys.stdout.write(x)

这只处理最简单的情况,但应该很容易扩展到更复杂的情况。

$echo "this ( is my ) simple case"|./replace.py
$this (_is_my_) simple case
$
于 2013-01-02T23:22:32.497 回答
0

假设没有嵌套括号或破括号对,最简单的方法是这样使用Perl

perl -pe 's{(\([^\)]*\))}{($r=$1)=~s/ /_/g;$r}ge' file

结果:

this (_is_my_) simple example
于 2013-01-03T00:32:01.393 回答
0

这可能对您有用(GNU sed):

sed 's/^/\n/;ta;:a;s/\n$//;t;/\n /{x;/./{x;s/\n /_\n/;ta};x;s/\n / \n/;ta};/\n(/{x;s/^/x/;x;s/\n(/(\n/;ta};/\n)/{x;s/.//;x;s/\n)/)\n/;ta};s/\n\([^ ()]*\)/\1\n/;ta' file

这迎合了多行的嵌套括号。然而,它可能非常缓慢。

于 2013-01-03T02:30:41.957 回答