私のデータは次のとおりです。
$ cat input
1212103122
1233321212
0000022221
出力が次のようになります。
$ cat output
1 2 1 2 1 0 3 1 2 2
1 2 3 3 3 2 1 2 1 2
0 0 0 0 0 2 2 2 2 1
私は試した:
sed -i 's// /g' input > output
しかし、うまくいきません。
どんな提案がありますか?
答え1
これは私にとって効果的です。
sed 's/./& /g' input > output
$ cat input
1212103122
1233321212
0000022221
$ cat output
1 2 1 2 1 0 3 1 2 2
1 2 3 3 3 2 1 2 1 2
0 0 0 0 0 2 2 2 2 1
答え2
あなたのため:
sed 's/\(.\{1\}\)/\1 /g' input > output
変更をそのまま保存するには:
sed -i 's/\(.\{1\}\)/\1 /g' input
仕組み:
s/\(.\{1\}\)/\ /g
1文字ごとにスペースが追加されます。
たとえば、次のような出力ファイルが必要な場合:
12 12 10 31 22
12 33 32 12 12
00 00 02 22 21
私の答えは次のように編集できます。
sed -i 's/\(.\{2\}\)/\1 /g'
したがって、2文字ごとにスペースが追加されます。
また、/\1 /
はと同じで/&
スペースを追加します。たとえば、次の3つを追加します。/\1 /
または/& /
。より多くのオプションが利用可能です。 Sedは非常に強力なツールです。
またはい、@Law29で述べたように削除しないと、各行の末尾にスペースが残ります。したがって、スペースが追加されたときに削除するには、指定されたs/ $//
ソリューションの最後にaを追加するだけです。 :
sed 's/./& /g; s/ $//'
これが役に立つことを願っています。
答え3
-i
ファイルをその場で編集することを選択できます。これにより、正しい解決策が見つからない可能性があります。
sed
問題は、許可されていない空の文字列を一致させようとしていることです。代わりに、任意の文字と一致し、それを同じ文字の後にスペースが続く文字に置き換えます。これにより、各行の末尾にスペースが残り、他のsedを使用して削除できます。
$ cat input
1212103122
1233321212
0000022221
$ sed -e 's/./& /g' -e 's/ $//' input > output
$ cat output
1 2 1 2 1 0 3 1 2 2
1 2 3 3 3 2 1 2 1 2
0 0 0 0 0 2 2 2 2 1
$
答え4
オプションは次のとおりですawk
。
awk -F '' '{$1=$1}1' input > output
動作原理は次のとおりです。
空のフィールド区切り文字を設定して、
-F ''
入力レコード(行)を単一の文字に分割します。評価では、デフォルトの
$1=$1
出力フィールド区切り文字(スペース)を使用してレコードを強制的に書き換えます。1
true なので結果を印刷してください。
Perlにも同様のトリックがあります:
perl -F'' -alne 'print join " ", @F' input > output
表示するには:
$ awk -F '' '{$1=$1}1' input
1 2 1 2 1 0 3 1 2 2
1 2 3 3 3 2 1 2 1 2
0 0 0 0 0 2 2 2 2 1