我有一个带有制表符分隔数据的字符串,如下所示:
h1 h2
a1 b1
a2 b2
我是用 Windows 上的记事本制作的。我创建了制表符分隔数据,确保使用制表符而不是空格。
我使用 PuTTY 通过 SSH 连接到 Linux 服务器。我想将文件写入/tmp/test.txt
并保留选项卡。所以我跑了cat <<EOF >/tmp/test.txt
。我从记事本复制文本并将其粘贴到 putty 会话中。然后我进入EOF
。
但是,这会生成一个没有选项卡的文件,其内容为:
h1h2
a1b1
a2b2
我发现这有效:
sed 's/\\t/\t/g' > /tmp/test.txt << EOF
h1\th2
a1\tb1
a2\tb2
EOF
但是,它要求我将输入字符串更改为使用 '\t' 而不是实际制表符。有什么更优雅/更简单的解决方案可以让我从 Windows 中原样获取字符串文字并将其写入远程 Linux 计算机上的文件中?
我通过 putty 从 Windows 通过 SSH 连接到 Linux 服务器。服务器是:
- 发行版:Red Hat Enterprise Linux Server 6.6 版(圣地亚哥)
- Bash 版本:4.1.2(1)-release (x86_64-redhat-linux-gnu)
- 猫: coreutils-8.4-37.0.1.el6.x86_64
答案1
当您在 shell 中键入内容时,shell 将某些字符识别为命令。例如,回车符(按键发送的字符Enter)使 shell 执行命令。制表符使 shell 执行完成操作。当您将某些内容粘贴到 PuTTY 终端窗口中时,从 shell 的角度来看,这与您键入这些字符是一样的。因此,在粘贴制表符时,shell 会执行完成操作,但不会插入制表符。
复制文件而不进行转换的最简单方法是使用 PuTTY 的配套程序 PSCP 或 PSFTP 来复制文件。从概念上讲,这是最简单的方法,但它确实有运行另一个程序、身份验证、选择目录等的开销。
如果您想要内联内容,可以直接粘贴到 中cat
,而不是粘贴到此处的文档中。然后,您将粘贴到终端的行编辑器中,而不是粘贴到 shell 的行编辑器中。由于终端的行编辑器非常原始,只有少数控制字符具有特殊含义,不包括制表符。在行首按Ctrl+可终止输入。D
[darkstar /]$ cat >text.txt Paste Ctrl+D [暗星/]$
如果您想通过解释控制字符的介质传输任意数据,您可以将其编码为仅使用“驯服”字符的形式。Base64是一;它不使用任何控制字符并忽略空格和换行符。 GNU coreutils 是 Linux 和 Cygwin 上基本安装的一部分,包括base64
命令。在发送方,运行base64 <file-to-decode
,例如
- 在 Windows 上:
base64 c:/path/to/test.txt
从 Cygwin 终端运行 - 复制输出。
- 在 PuTTY 窗口的 shell 中,输入 `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 手册解释(上[n]<<[-]word
):
如果引用了 word 的任何部分,则分隔符是对 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。