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
。しかし、何もありません。ここで非常に重要で基本的なものが欠けているようです。
答え1
sed
改行区切り記号\n
- 常に入力時に削除され、出力時に再挿入されます。持ついいえ\n
sed
編集結果として表示されないパターンスペースの新しい行文字。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