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

-textxvkbd는 ě와 같은 분음 부호를 이해하지 못하지만 와 같은 형식으로만 이해하기 때문에 텍스트가 체코어(내 언어)로 되어 있을 때 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; .... 또는 콜론을 사용하지 않고 각 대체 표현식을 새 줄에 넣으면 멋지게 정렬될 수 있습니다...

관련 정보