다음과 같이 탭으로 구분된 데이터가 포함된 문자열이 있습니다.
h1 h2
a1 b1
a2 b2
저는 Windows에서 메모장을 사용하여 만들었습니다. 공백이 아닌 탭을 사용하여 탭으로 구분된 데이터를 만들었습니다.
PuTTY를 사용하여 SSH를 통해 Linux 서버에 연결합니다. 파일을 작성 /tmp/test.txt
하고 탭을 유지하고 싶습니다 . 그래서 나는 달렸다 cat <<EOF >/tmp/test.txt
. 메모장에서 텍스트를 복사하여 퍼티 세션에 붙여넣습니다. 그런 다음 EOF
.
그러나 이렇게 하면 탭 없이 다음 내용의 파일이 생성됩니다.
h1h2
a1b1
a2b2
나는 이것이 효과가 있다는 것을 알았습니다.
sed 's/\\t/\t/g' > /tmp/test.txt << EOF
h1\th2
a1\tb1
a2\tb2
EOF
그러나 실제 탭 문자 대신 '\t'를 사용하도록 입력 문자열을 변경해야 합니다. Windows에서 문자열 리터럴을 있는 그대로 가져와 원격 Linux 시스템의 파일에 쓸 수 있는 더 우아하고 간단한 솔루션이 있습니까?
퍼티를 통해 Windows에서 SSH를 통해 Linux 서버에 연결하고 있습니다. 서버는 다음과 같습니다:
- 배포판: Red Hat Enterprise Linux Server 버전 6.6(샌디에고)
- Bash 버전: 4.1.2(1)-릴리스(x86_64-redhat-linux-gnu)
- 고양이: coreutils-8.4-37.0.1.el6.x86_64
답변1
쉘에 입력하면 쉘은 특정 문자를 명령으로 인식합니다. 예를 들어, 캐리지 리턴 문자(keypress에 의해 전송된 문자 Enter)는 쉘이 명령을 실행하도록 합니다. 탭 문자는 쉘이 완료 작업을 수행하도록 합니다. PuTTY 터미널 창에 무언가를 붙여 넣으면 셸의 관점에서 해당 문자를 입력하는 것과 같습니다. 따라서 탭 문자를 붙여넣을 때 쉘은 완성을 수행하지만 탭 문자를 삽입하지는 않습니다.
파일을 변환하지 않고 복사하는 가장 쉬운 방법은 PuTTY의 보조 프로그램 PSCP 또는 PSFTP를 사용하여 파일을 복사하는 것입니다. 개념적으로 이는 가장 간단한 접근 방식이지만 다른 프로그램 실행, 인증, 디렉터리 선택 등의 오버헤드가 있습니다.
콘텐츠를 인라인으로 원하는 경우 cat
여기 문서에 직접 붙여넣는 대신 콘텐츠에 직접 붙여넣을 수 있습니다. 그런 다음 셸의 줄 편집기가 아닌 터미널의 줄 편집기에 붙여넣습니다. 터미널의 줄 편집기는 매우 원시적이므로 탭을 제외한 몇 가지 제어 문자만 특별한 의미를 갖습니다. Ctrl입력을 종료하려면 줄 시작 부분에서 +를 누르세요 .D
[darkstar /]$ 고양이 >text.txt Paste Ctrl+D [다크스타/]$
제어 문자를 해석하는 매체를 통해 임의의 데이터를 전송하려는 경우 "길들인" 문자만 사용하는 형식으로 인코딩할 수 있습니다.Base64제어 문자를 사용하지 않으며 공백과 개행 문자를 무시합니다. GNU coreutils는 Linux 및 Cygwin의 기본 설치의 일부이며 다음을 포함합니다.base64
주문하다. 발신자 측에서는 base64 <file-to-decode
다음을 실행합니다.
- Windows:
base64 c:/path/to/test.txt
Cygwin 터미널에서 실행 - 출력을 복사합니다.
- PuTTY 창의 셸에서 `base64 -d >/tmp/test.txt를 입력하고 를 누릅니다 Enter.
- 붙여넣은 출력
base64
. - Ctrl+를 누릅니다 D.
답변2
어떤 문제가 있는지 잘 모르겠습니다. RHEL 설치에서 cat
탭 정지를 주면 작동합니다. 그러나 보다 일반적인 해결책은 다음과 같습니다.
#!/usr/bin/perl
use strict;
use warnings;
while ( <> ) {
s/\s+/\t/g;
print;
}
STDIN
"입력" (삽입) 또는 파일 이름(예: )을 허용 myscript.pl <filename>
하고 모든 공백을 탭 정지로 변환합니다.
답변3
그보다 더 간단한 솔루션을 원한다면 perl script
sed를 사용할 수 있습니다. perl script
어쨌든 매우 간단합니다.
echo "hello world" | sed 's/\(\t\+\)/\t/g'
어쨌든 redhat 5
cat 명령을 사용하는 데 아무런 문제가 없습니다.
rpm -qf $(which cat)
coreutils-5.97-34.el5
답변4
Bash 매뉴얼 설명(1부 [n]<<[-]word
):
단어의 일부가 인용된 경우 구분 기호는 단어에서 인용문을 제거한 결과이며 문서의 줄은 여기에서 확장되지 않습니다. 단어가 인용되지 않으면 여기 문서의 모든 줄은 매개변수 확장, 명령 대체 및 산술 확장을 거치게 됩니다.
cat >/tmp/test.txt <<'EOF'
그럴 수도 있지만 ,아니요:TAB은 계속 확장 중입니다. readline 라이브러리인 것 같으므로 간단한 해결책이 있습니다:
user@host:~> bash --noediting
user@host:~> cat >/tmp/test.txt <<EOF
(지금 데이터를 붙여넣으세요)
EOF
user@jhost:~> exit
(여분의 껍질은 남겨두세요)
Windows와 SSH 지원 UNIX 간에 파일을 교환하는 또 다른 도구는 다음과 같습니다.WinSCP.