2017-12-03 8 views
-4

に空白のすべての発生を置き換えるための最良の方法私はUnixシェル - 文字列

'abc', '<<some string with space>>', 'xyz' 

のような文字列を持って、私は以下のような文字列を取得したい: - awkと単純

'abc', '<<some_string_with_space>>', 'xyz' 
+1

改行は空白です。引用符付きの文字列に改行を含めることはできますか?エスケープされた引用符( '\ ''または '' '')を含めることはできますか?コンマを入れることはできますか?あなたは空のフィールド '' 'を持つことができますか? **本当にターゲット文字列**は常に<< << >>で始まり、>> >>で終わりますか?簡潔でテスト可能なサンプル入力とすべてのユースケースをカバーする期待される出力を思いついて、あなたの要件を推測しないでください。 –

答えて

0

を:

s="'abc', '<<some string with space>>', 'xyz'" 
awk -F', ' '{ gsub(/[[:space:]]+/,"_",$2) }1' OFS=', ' <<<"$s" 

出力:

'abc', '<<some_string_with_space>>', 'xyz' 
+0

's =" 'hello、world' "'についてはどうですか? –

+0

@RomanPerekhrest、文字列に '、'の間に空白がない場合は動作しません。 s = "'abc'、 '<<スペースのある文字列>>'、 'xyz'" –

+0

@gniourf_gniourf、可能なすべての入力を精緻化する方法は?私たちは具体的なケースを持っています – RomanPerekhrest

-1

空白文字を置き換えるには、正規表現\ sでawkのgsubを使用します。

mystr = "my sentence is this!" 
gsub(/\s/,"_",mystr) 
print mystr 
+0

私はdownvote didin'tしかし、あなたはGNU awkの '\ s'について言及すべきです - 他のawksには' [[:space:]] 'が必要です。 –

0

あなたの質問には、単一引用符で囲まれた文字列'...'ではなく、他の部分で、私は解決するだろう 内部_に置き換えスペースの一般的な問題に関係する場合は、このロジック以下、Perlを使用して:

    _ですべてのスペースを置き換える機能を実行
  • :入力内の各'...'について
  • '[^']+'正規表現を使用して)このよう

:あなたがこれはあなた(GNU SED)のために働くかもしれない、あまりにも

echo "'abc', '<<some string with space>>', 'xyz'" | sed s'/ /_/g;s/,_/, /g' 
1

、より確実に
sed ":a;s/^\(\('[^']*',\s*\)*'[^' ]*\) /\1_/;ta" file 

または多分:

sed ':a;s/^\(\('\''[^'\'']*'\'',\s*\)*'\''[^'\'' ]*\) /\1_/;ta' file 
+0

「エコー」「こんにちは、世界」はどうですか? sed s '//_/g; s /、_ /、/ g''? –

+0

@gniourf_gniourf、そうだよ、それはいつも<< ... >であるなら、sed -E ':A; s /(<[^] *)()([^、] *)/ \ 1_ \ 3 /; tA ' –

0

をsedを使用することができます

echo "'abc', '<<some string with space>>', 'xyz'" |\ 
    perl -pe 'sub r { $_ = @_[0]; s/ +/_/g; return $_; }; s/'"'[^']+'"'/r($&)/ge' 
関連する問題