質問
次のようなパターンがあります
hi
hello
hallo
greetings
salutations
no more hello for you
次のコマンドを使用して、すべての改行をタブに置き換えようとしています
sed -e "s_/\n_/\t_g"
しかし、機能していません。
誰か助けてくれませんか? sed / awkで解決策を探しています。
解決
必要な出力がわからない
# awk -vRS="\n" -vORS="\t" '1' file
hi hello hallo greetings salutations no more hello for you
他のヒント
こちら tr
の方が良いと思います:
tr "\n" "\t" < newlines
Nifleがコメントで示唆したように、ここの newlines
は元のテキストを保持するファイルの名前です。
sed
は行指向であるため、このような場合に使用するのはより複雑です。
sed '$!{:a;N;s/\n/\t/;ta}' file
改行を1行ずつ sed
で置き換えることはできません。行を蓄積して、改行を between 置き換える必要があります。
text abc\n <- can't replace this one
text abc\ntext def\n <- you can replace the one after "abc" but not the one at the end
この sed
スクリプトは、すべての行を蓄積し、最後を除くすべての改行を削除します。
sed -n '1{x;d};${H;x;s/\n/\t/g;p};{H}'
ところで、 sed
スクリプト sed -e&quot; s _ / \ n _ / \ t_g&quot;
は、すべてのスラッシュに続いて改行を入れて「スラッシュとそれに続くタブ」。アンダースコアは s
コマンドの区切り文字の役割を果たしているため、スラッシュを検索および置換用の文字としてより簡単に使用できます。
paste -s
-s各個別入力ファイルのすべての行を連結します コマンドラインの順序。すべての行の改行文字 ただし、各入力ファイルの最後の行は、 -dオプションで指定されていない限り、タブ文字。
sedスクリプトがほとんど揃っているので、次のように変更する必要があります。
sed -e "s/\n/\t/g"
エスケープするには \
で十分です。 _
を追加する必要はありません。
そして、最後に g
の前に /
を追加して、これがスクリプトの最後の部分であることをsedに知らせる必要があります。