
中クリックによる貼り付けをシミュレートするためにキーボード ショートカットに割り当てるスクリプトがあります。
#!/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'
が、改善方法がわかりません。\n
s に何らかの配慮をする必要があると思いますか?
答え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; ....
または、コロンを使わずに各置換式を新しい行に配置することもできます。これにより、プロセスをきれいに並べることができます...