xsel から入力されたときに xkvbd が改行文字を消費するのはなぜですか?

xsel から入力されたときに xkvbd が改行文字を消費するのはなぜですか?

中クリックによる貼り付けをシミュレートするためにキーボード ショートカットに割り当てるスクリプトがあります。

#!/bin/bash
aa=0
for randstring in `xsel`
do
  if [[ "$randstring" =~ [ěščřžýáíéúůóťďň] ]]
  then
      xxx=`xsel|sed 's/ě/\\\[ecaron]/g' |sed 's/š/\\\[scaron]/g' |sed 's/č/\\\[ccaron] g' |sed 's/ř/\\\[rcaron]/g' |sed 's/ž/\\\[zcaron]/g' |sed 's/ý/\\\[yacute]/g' |sed 's/á/\\\[aacute]/g' |sed 's/í/\\\[iacute]/g' |sed 's/é/\\\[eacute]/g' |sed 's/ú/\\\[uacute]/g' |sed 's/ů/\\\[uring]/g'  |sed 's/ó/\\\[oacute]/g' |sed 's/ď/\\\[dcaron]/g' |sed 's/ň/\\\[ncaron]/g' |sed 's/ť/\\\[tcaron]/g'  |sed ':a;N;$!ba;s/\n/\\n/g'`
      xvkbd -text "$xxx" 2>/dev/null
      aa=1
      break
  else
    aa=0
  fi
done
if [[ $aa -eq 0 ]]
    then
        xsel | xvkbd  -file - 2>/dev/null
fi

私は-textテキストがチェコ語(私の言語)のときにxvkbdで を使用します。xvkbdはěのような発音区別符号を理解できず、 のような形式のみを理解するからです\[ecaron]。このオプションを使用すると、xselに改行がある場合、xvkbdでは印刷されません。しかし、

xx="---8<-----\nToday date is: $(date +%Y%m%d)\n---8<-----" 
xvkbd -text "$xx"  2>/dev/null

改行は印刷されます。

問題は最後の sed 式にあると思われますsed ':a;N;$!ba;s/\n/\\n/g'が、改善方法がわかりません。\ns に何らかの配慮をする必要があると思いますか?

答え1

編集: 問題は見つかりましたが、実際に末尾に改行が必要な場合には、残りの部分も読む価値があるかもしれません。

余分なものが欠けている\\、あるいは\

  sed ':a;N;$!ba;s/\n/\\\\n/g'`  

$( )詳細情報:の vs バッククォートの問題に関して command substitution、この質問に対して私が投稿したコメントで言及されているように、 からの抜粋を以下に示しますman bash

When  the  old-style  backquote form of substitution is used, backslash
retains its literal meaning except when followed by $, `,  or  \.   The
first backquote not preceded by a backslash terminates the command sub‐
stitution.  When using the $(command) form, all characters between  the
parentheses make up the command; none are treated specially.

--オリジナル投稿--

最後は印刷されません\nが、中間部分が追加され\n ます$xx...

前回の通話の簡略版は次のとおりですsed

printf '%s\n' 'a\[ecaron]' b c '\[rcaron]d' |
   sed ':a;N;$!ba;s/\n/\\n/g' 

出力:

a\[ecaron]\nb\nc\n\[rcaron]d

上記の例で、最後に改行文字がない理由\nは、最終行のパターン スペースに末尾の改行文字が存在しないからです ( を介して、以前の行末からの改行文字のみN存在します)... は、その後、終了時に最後の改行文字を出力しますが、それでも、または によって取り込まsedれてしまいます... xx=$(command substitution)$( )backticks

最終の を含めるには\n、最終の置換を 1 つだけ行う必要があります。

sed ':a;N;$!ba;s/\n/\\n/g;s/$/\\n/'

それとも、中間の s さえも取得していないケースですか\n?


余談ですが、seds多数のプロセスを呼び出します。それらを;(コロン) で連結することもできます。sed 's/ě/\\\[ecaron]/g; s/š/\\\[scaron]/g; .... または、コロンを使わずに各置換式を新しい行に配置することもできます。これにより、プロセスをきれいに並べることができます...

関連情報