2017-12-07 35 views
1

テキストファイルがあり、テキストファイル内の行の値を特定の区切り記号(たとえば、:)で区切りたい場合があります。区切り文字でテキストファイルのフィールドを区切る方法

私は、テキストファイルにSQLクエリの出力を格納することで、テキストファイルを生成しています。

cat /tmp/file.txt | sed 's/ /:/g' 

が、スペースが行の上に一貫性がないとして、これは私のために動作しません:テキストファイルの

内容は、私はこれを試してみました

field 1.2  xxxx 
field 2.7.1 xxxx 
field 1.9  xxxx 
field 1.4  xxxx 
field 2.7.1 xxxx 

です。

どうすればいいですか? 私はここに期待していた出力は、この

field :1.2 :xxxx 
field :2.7.1 :xxxx 
field :1.9 :xxxx 
field :1.4 :xxxx 
field :2.7.1 :xxxx 
+0

あなたの要件..今のところあなたが持っている答えは、すべて同じ出力を生成するわけではありません。 – Sundeep

+0

はい私の質問を編集し、期待される出力を貼り付けました – panda

+1

SQLアプリケーションはオプションを使用して出力をコンピューターで読み取り可能な形式で保管できます。あなたが期待しているパディングされた出力は、特に有用に見えません。おそらく、CSVやJSONのような標準的なフォーマットで、おそらくパディング無しには良いでしょう。 – tripleee

答えて

0

スペース - スペース - アスタリスクのようなものです。最初のスペースは1が存在しなければならないと言って、アスタリスクを有する第二は、0個以上のエキストラを言うために。 GNUでsed 's/ */:/g'

0

は、コロンと2つの以上のスペースを置き換えるために、sedを:

sed -E 's/ {2,}/:/' file 

又は第二の1つ以上のスペースにマッチする文字列:

sed -E 's/ +/:/2' file 
0

あなたはtr with its "squeeze" optionを使用することができます。

$ tr -s ' ' : < input 
field:1.2:xxxx 
field:2.7.1:xxxx 
field:1.9:xxxx 
field:1.4:xxxx 
field:2.7.1:xxxx 

これは、単一の一つに繰り返された空間の任意のシーケンスを絞り、これはコロンで置き換えられます。

0
$ sed -E 's/[[:blank:]]+/&:/g' /tmp/file.txt 
field :1.2  :xxxx 
field :2.7.1 :xxxx 
field :1.9  :xxxx 
field :1.4  :xxxx 
field :2.7.1 :xxxx 
  • no need to use cat、多くのCLIツールはリテラルのスペースを使用し、あなただけのスペース文字がある知っていれば
  • [[:blank:]]は、スペースやタブ文字に一致するように両方の標準入力やファイルの入力を受け付ける
  • +ものと一致します以上の空白文字で、EREを有効にする-Eオプションの使用に注意してください。 EREが使用できない場合は、一部sedのバージョンでは、置換部にsed 's/[[:blank:]]\{1,\}/&:/g'
  • &を使用し、唯一の-r代わり-E
    • でマッチした文字列全体を指しサポートする場合があります明確に役立つだろう完全に予想される出力を加算
  • +1

    cool..thisソリューションは、実際に多くのことをworked..thanks ... – panda

    関連する問題