7

文字列内で、括弧内のすべてのスペースをアンダースコアに置き換えようとしています。たとえば、this ( is my ) simple example取得したい場合this (_is_my_) simple example

私はbashに取り組んでおり、sedの置換式を作成することを考えていますが、単純な1行のソリューションを思い付くことができません。

あなたの助けを楽しみにしています

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

パターンが1つの行に複数回出現する可能性がある場合は、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 に答える