
가운데 클릭을 통해 붙여넣기를 시뮬레이션하기 위해 키보드 단축키를 할당하는 다음 스크립트가 있습니다.
#!/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]
. 이제 이 옵션을 사용하면 개행 int 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'
어떻게 개선해야 할지 모르겠습니다. 어떻게든 s를 돌봐야 할 것 같아요 \n
?
답변1
편집: 문제를 찾았지만 실제로 후행 개행 `...을 원할 때 나머지 부분은 여전히 읽을 가치가 있을 수 있습니다.
추가 항목이 누락되었거나 \\
심지어\
sed ':a;N;$!ba;s/\n/\\\\n/g'`
$( )
추가 정보: 에 대한 역인용 대 문제와 관련하여 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
위의 예에서 final이 없는 이유는 \n
단순히 마지막 줄의 패턴 공간에 후행 개행 문자가 없기 때문입니다(이전 줄 끝의 문자만 via 에 N
있음). ... 이후에 종료될 때 최종 개행 문자를 출력하지만, 그럼에도 불구하고 by 또는 ... sed
에 의해 먹어치워질 것입니다.xx=$(command substitution)
$( )
backticks
final 을 포함하려면 \n
최종 대체가 하나만 필요합니다.
sed ':a;N;$!ba;s/\n/\\n/g;s/$/\\n/'
아니면 중간 s도 못받고 있는 경우인가요 \n
?
참고 사항: 열 개를 많이 가질 필요는 없습니다.sed그렇게 많은 프로세스를 호출합니다. 예를 들어 (콜론) 을 통해 연결할 수 있습니다 ;
. sed 's/ě/\\\[ecaron]/g; s/š/\\\[scaron]/g; ....
또는 콜론을 사용하지 않고 각 대체 표현식을 새 줄에 넣으면 멋지게 정렬될 수 있습니다...