次の構造のファイルがあります。
2015-03-25 17:08:17
sysUpTimeInstance 93474;^M
1.ValueforState=2500
改行文字を変更して3行目を2行目にしておきたいです。つまり、出力は次のようになります。
2015-03-25 17:08:17
sysUpTimeInstance 93474;1.ValueforState=2500
私はsedを試してみます:
sed 's/^M$//' myfile.dat > mynewfile.dat
ただし、^M記号のみが削除されます。
どんな提案がありますか?
答え1
2つの考え:
sed を使用して、キャリッジリターンで終わる行に次の行を追加します。
sed '/\r$/ {N; s/\r\n//} ' file
awk を使用して、入出力のレコード区切り記号を定義します。
awk -v RS='\r\n' -v ORS='' 1 file
答え2
投稿に表示される内容が^M
実際にキャリッジリターン(\r
)であると仮定した場合は、次のことを行う必要があります。
perl -pe 's/\r\n//g'
これは入力に含まれる行数に関係なく機能します。で終わるすべての行は、\r\n
次の行に関連付けられます。
答え3
何が起こるかもしれません。
^M
実際には2文字ではありませんが、一部の編集者がキャリッジリターン(CR)文字を表す方法である^
場合。M
例えば。これが私のEmacsエディタの外観です。この文字は、end-of-line
Windowsファイルシステムの文字ペアであるキャリッジリターン(16進値0x0D)+改行(16進値0x0A)の一部です。改行文字は改行文字とも呼ばれます。 Unixファイルシステムは、改行にのみ改行を使用します。 Unixスタイルの行の末尾から不要なキャリッジリターンを削除するには、sed
次の正規表現を使用できます。注\x0D
と\r
その両方が適用されますsed
。注:\r
これはの略語です0x0D
。
sed '/\r$/{N; s/\r\n//}'
実際には^M
2つの文字がある場合(WindowsファイルがUnixスタイルファイルに誤って変換されたときに発生する場合があります)、これを特殊な正規表現文字として扱う必要があります。バックスラッシュを使用する必要があります。次の順序を使用してください。 ^
M
^
escape
\
sed
sed '/\^M$/{N; s/\^M\n//}'
答え4
実際には3行だけあり、常に2行目と3行目を接続するには、次のコマンドを使用できます。
sed -e '2N' -e 's/\r\n//'
Nコマンドは、次の行(つまり3行目)を2行目に追加してから、置き換えによって改行文字を削除します。