sedが改行文字を削除できない


12

私はsedかなり長い間使用してきましたが、これは私が出くわした気まぐれで、解決できません。

実際のケースで私の問題を説明させてください。


シーン#1

printf "ls" | xclip -selection clipboard
echo "ls" | xclip -selection clipboard

最初のコマンドでは、printf出力をパイプxclipしてクリップボードにコピーします。現在、printfとは異なりecho、デフォルトでは末尾に新しい行を挿入しません。そのため、このコンテンツをターミナルに貼り付けlsても、コピーされたコマンドは自動的に実行されません。

2番目では、最後に新しい行があるので、クリップボードの内容を貼り付けると、クリップボードでコマンドが実行されます。

これは私には望ましくありません。そのため、を使用して改行を削除したかったのですsedが、以下のシーンで説明されているように失敗しました。

シーン#2

echo "ls" | sed -r 's/\n//g' | xclip -selection clipboard

クリップボードのコンテンツにはまだ改行が含まれています。端末に貼り付けると、コマンドが自動的に実行されます。

改行文字も削除してみました\r。なだ。ここに非常に重要な/基本的な何かが欠けているようです。

回答:


16

sed上の区切り\newlines -彼らは常に入力で除去し、出力に再挿入されています。ありませんでし\nにおけるewline文字sedあなたが行った編集の結果として発生しなかったパターンスペースが。 注:GNU sed-zモードを除いて...

ただ使用するtr

echo ls | tr -d \\n | xclip -selection clipboard

または、さらに良いことに、sed完全に忘れてください:

printf ls | xclip -selection clipboard

これによりすべての改行が削除されますが、多くのgenerate-text | xclip場合このケースでは望ましくありません。この回答は最後の改行のみを削除します。
トム・ヘイル

7

sedを含む多くのテキスト処理ツールは、改行文字を除いて、行のコンテンツを操作します。行を処理するときに最初にsedが行うのは、最後の改行を削除することです。次に、スクリプト内のコマンドを実行し、印刷時に最後の改行を追加します。したがって、sedを使用して改行を削除することはできません。

すべての改行を削除するには、tr代わりに使用できます:

echo "ls" | tr -d '\n' | xclip


4

-zオプションを渡すことで、sedの改行を置き換えることができます。

sed -z 's/\n/ /g'

Sedのmanページ:

-z、--null-data行をNUL文字で区切ります


これにより、すべての改行が削除されます。これは通常、この| xclipケースでは望ましくありません。
トム・ヘイル

2

コマンドをクリップボードに置くだけの場合

echo -n "ls " | xclip -selection clipboard

さらに複雑な変換を行う必要がある場合は、

echo "ls  " | perl -pe 's/\n//' | xclip -selection clipboard

うーん。スムーズなソリューション。正規表現については、おそらくperlまたはpythonに移るときだと思います。
シバム2015年

3
@shivams- perlと正しく使用した場合よりpython両方とも非常に遅いですsed。ただし、正しく使用することを学ぶことが重要です。
mikeserv 2015年

@mikeserv-同意します。ワンライナーsedのための特別な素晴らしいです。変換がより複雑になる場合は、perl / python / gawkを使用します。
JJoao 2015年

1
@JJoa:あなたの好みはあなた自身ですが、sedあなたのワンライナーだけを処理するよりもはるかに多くを行うことができ、あなたが言及する他のどのツールよりも速くそうすることができます。
mikeserv 2015年

1
@mikeserv-もう一度、私はあなたに同意します。数年前、sedによって生成された翻訳システムEN-PTがsed(20000 s /.../.../)で記述されていました。そしてそれはうまくいった!その後、Perlになり、配列、ハッシュ、関数、パッケージ、CPANができました。
JJoao 2015年

1

最後の改行のみを削除するには、次のようにパイプします

sed -z '$ s/\n$//'

sed\0デリミタがNULvia -zに設定されている場合、ストリームの最後にa を追加しませんが、POSIXテキストファイル(aで終わるように定義されている\n)を作成する場合は、常に\nなしで最終を出力します-z

例えば:

$ { echo foo; echo bar; } | sed -z '$ s/\n$//'; echo tender
foo
bartender

そしてNUL追加されていないことを証明するために:

$ { echo foo; echo bar; } | sed -z '$ s/\n$//' | xxd
00000000: 666f 6f0a 6261 72                        foo.bar

末尾の複数の改行削除するには、次のようにパイプします。

sed -Ez '$ s/\n+$//'
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.