パターンで始まる行の末尾から新しい行を置き換える [重複]

パターンで始まる行の末尾から新しい行を置き換える [重複]

私のUbuntuコンピュータにファイルがあり、「@」を使用して特定の行の先頭をマークしました。

@A
bbb
@B
bbb
@D
ccc

上記のファイルになるように、「@」で始まる行の末尾から新しい行を削除したいと思います。

@Abbb
@Bbbb
@Dccc

sed を使用して @ で始まる行を一致させることができます。

sed /^@/ ...

しかし、文字列の末尾にある改行文字を削除する方法を見つけようとしています。sedテキストエディタで手動でファイルを開いて直接削除することなく、これを簡単に行う方法が必要です。

答え1

$ printf '%s\n' 'g/^@/j' ',p' 'Q' | ed -s file
@Abbb
@Bbbb
@Dccc

上記は短いスクリプトを使用して、ed正規表現に一致するファイルの各行を後の行に^@関連付けます。その後、編集バッファのすべての行を印刷し、保存せずに終了します。


$ sed '/^@/ { N; s/\n//; }' file
@Abbb
@Bbbb
@Dccc

sed現在の行が一致すると、このコマンドは次の行を入力バッファに追加します^@。挿入された改行文字が削除され、その行が印刷されます。

@どちらのバリエーションも、その行が直後に来ると、その行で始まる行を見逃します。これは彼らが次に向かうことを意味します。

@1
@2
X
@3
Y

入力する

@1@2
X
@3Y

代わりに

@1@2X
@3Y

これが大丈夫かどうかは不明です。

答え2

Perlが救出に来る!

perl -pe 'chomp if /^@/' -- file
  • -p入力した内容を1行ずつ読み、処理後に各行を印刷します。
  • /^@/@行の先頭に一致します。
  • 噛む末尾の改行を削除

答え3

雨 sed

  1. すべての行が@と@ではないものを交互に使用することがわかっている場合は、

    paste -d '' - - < file
    
  2. アッ

    awk '{printf "%s%s", $0, (/^@/ ? "" : ORS)}' file
    

答え4

そしてperl

$ perl -pe 's/^(@.*)\n/\1/' file
@Abbb
@Bbbb
@Dccc

または

$ perl -pe 's/\n// if /^@/' file
@Abbb
@Bbbb
@Dccc

関連情報