sed は改行文字を削除できません

sed は改行文字を削除できません

sed長い間使ってきましたが、解決できない不思議な点に出会いました。

実際のケースで私の問題を説明しましょう。


シーン1

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

最初のコマンドは、printf出力をパイプしてxclipクリップボードにコピーします。デフォルトでは、新しいprintfechoは最後に挿入されません。したがって、これを端末に貼り付けると、コピーされたlsコマンドは自動的には実行されません。

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

これは私にとっては望ましくありません。だから私は改行文字を削除したかったのですが、sed以下のシナリオで説明されているように失敗しました。

シナリオ #2

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

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

私もキャリッジリターンを削除してみました\r。しかし、何もありません。ここで非常に重要で基本的なものが欠けているようです。

答え1

sed改行区切り記号\n- 常に入力時に削除され、出力時に再挿入されます。持ついいえ\nsed編集結果として表示されないパターンスペースの新しい行文字。sed注:GNUモードは除外-z...

ただ使用してくださいtr

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

それともsed完全に忘れてしまう方が良いです。

printf ls | xclip -selection clipboard

答え2

sedを渡すことで改行文字を置き換えることができます-ジオプション。

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

Sed マニュアルページ:

-z, --空のデータNUL文字で行を区切ります。

答え3

sedを含む多くのテキスト処理ツールは、改行以外の行の内容に対して機能します。 sedが行を処理するときに最初に行うことは、末尾の改行を削除してから、スクリプトでコマンドを実行して印刷するときに最後の改行を追加することです。したがって、sedを使用して改行文字を削除することはできません。

すべての改行文字を削除するには、以下を使用できますtr

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

答え4

コマンドをクリップボードに入れると

echo -n "ls " | xclip -selection clipboard

より複雑な変換も行う必要がある場合、

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

関連情報