在文本处理字段中,有没有办法知道制表符的长度是 8 个字符(默认长度)还是更少?
例如,如果我有一个带有制表符分隔符的示例文件,并且一个字段的内容适合少于一个制表符 (?7),并且如果我之后有一个制表符,那么该制表符将只是“制表符大小 – 字段大小” '的长度。
有没有办法获得一行上标签的总长度?我不是在寻找标签的数量(即 10 个标签不应该返回 10),而是这些标签的字符长度。
对于以下输入数据(字段之间的制表符分隔且只有一个制表符):
field0 field00 field000 last-field
fld1 fld11 fld001 last-fld
fd2 fld3 last-fld
Run Code Online (Sandbox Code Playgroud)
我希望计算每行中标签的长度,所以
11
9
9
Run Code Online (Sandbox Code Playgroud) 也许已经有一些答案可以间接回答我的问题,但我已经阅读了很多,但尚未找到对这种差异的满意答案。
回车的本义来自老式电传打字机:它的意思是将打印头在当前行中向左移动。如果您继续在当前行写入,您将覆盖已经写入的内容。如今,我们可以使用文本符号来指定这种行为\r
,它是在字符串中明确输入的。例如,在 Python 中您可以执行print('hello\rgoodbye')
,而在终端中您可以执行echo $'hello\rgoodbye'
,并且在这两种情况下您都只会看到goodbye
.
相比之下,伪回车也可以与 ASCII 控制字符^M
(用Ctrl-M
或键入Enter
)交互插入。我称它为伪回车是因为尽管它被广泛称为回车\r
,但令人惊讶的是它没有 insert ,而是 inserts \n
,这是换行的符号。
因此,交互式键入hello
, then Ctrl-M
, thengoodbye
出人意料地没有达到 的等价物hello\rgoodbye
,而是相当于hello\ngoodbye
.
这不是很矛盾吗?这背后的原理是什么?
我可能配置错误,但我不知道是什么。(请参阅下面的更新 1 和 2)在 中gnome-terminal
,当我点击Alt(没有任何其他键)时,它会立即发送^[<
到终端(我通过点击Ctrl+V之前进行了测试Alt)。由于我经常使用Alt+ Tab,这是非常不幸的,因为控制序列会,例如,移动到历史的开头或在vim
. 该Alt+ Tab,然而,这仍然可以通过窗口工作,并循环通缉。
可能是什么原因以及如何恢复 gnome-terminal 中的默认行为?
更新 1
我发现这仅发生在笔记本电脑键盘本身上,而不是使用外部连接的 USB 键盘。虽然连接了外部键盘,但两个 -Alt键的行为不同。
笔记本电脑是联想P53。
我仍然不知道如何为笔记本电脑键盘修复它,但至少我更接近问题的根源。
更新 2
运行xev
我很快击中(按下并立即释放)Alt一次;首先在笔记本电脑键盘上,然后在外部 USB 键盘上:
# LAPTOP KEYBOARD ALT-KEY
MappingNotify event, serial 39, synthetic NO, window 0x0,
request …
Run Code Online (Sandbox Code Playgroud) 我想找到我的文件中有哪些控制字符。我不搜索特定字符,但有可能\t
或\n
。我有一个程序告诉我:Invalid control character
。但当我打开文件时,我看不到任何东西。如何展现这些人物形象呢?我怀疑\n
or\t
或 一些添加空格的字符。
我尝试过:grep '\n' myfile.txt
但在输出中它标记了该n
字母。
我刚刚注意到,在通过cat
和重定向创建快速测试文件(例如,使用示例输入)时,我在不同的系统上看到了不同的行为。
以下是了解我在说什么的步骤:
运行cat > testfile
。
输入helli
,然后按退格键,然后输入o
。
按 Enter。
键入 Ctrl-D 结束输入。
运行od -a testfile
。
在某些系统上,例如 Mac,您将获得:
0000000 h e l l o nl
0000006
Run Code Online (Sandbox Code Playgroud)
在其他系统上,例如我通过 Windows 上的 MobaXterm 登录的 RHEL 5.7 主机,您可能会得到:
0000000 h e l l i bs o nl
0000010
Run Code Online (Sandbox Code Playgroud)
造成这种差异的代码在哪里?例如,在上面的例子中,我应该怀疑 MobaXterm,还是 RHEL 5 系统?或者我的键盘和文件系统之间的哪一层?
这与其说是一个真正的问题,不如说是一个出于好奇的问题;我显然可以通过使用文本编辑器来创建没有退格字符的文件,但这在过去让我感到困惑。有一次在一次随意的演示/培训期间,我提到通过创建文件cat
存在这个问题,退格字符被逐字取用,只是在学生使用的 Mac 上根本没有这种效果时才会显示错误。 所以这让我很好奇。
cat
有一个-v
选项可以将非打印字符转换为插入符号(如果我们不希望终端在cat
输出中按字面解释控制字符,这很有用)。
但据我了解,脱字符号仅适用于 ASCII 字母表中的非打印字符。那么,UTF 中不属于 ASCII 的非打印字符(例如https://www.compart.com/en/unicode/category/Cc)又如何呢?将使用什么符号cat -v
来显示这些?
在有效的shell \\u
(bash +4.3、ksh93 或 zsh)中,我们可以打印 Unicode 字符:
$ printf \'a b c \\ua0 \\ua1 \\ua2 \\ua3 \\n\'\na b c \xc2\xa1 \xc2\xa2 \xc2\xa3\n
Run Code Online (Sandbox Code Playgroud)\n这是Latin-1_Suplement范围中的一些字符。
\n然而,一旦9f
添加了 Unicode 字符,打印就会停止,直到打印出 Unicode 9c
。
和\\u9f
(\\u9c
APC 和 ST)都是C1
控制字符。
$ printf \'a b c \\u9f d e f \\u9c \\ua0 \\ua1 \\ua2 \\ua3 \\n\'\na b c \xc2\xa0 \xc2\xa1 \xc2\xa2 \xc2\xa3 \n
Run Code Online (Sandbox Code Playgroud)\n角色肯定会消失。
\n可以肯定的是,它printf
正在生成所有字符,并且将输出重定向到其他软件(而不是终端)将显示生成的字符:
$ printf …
Run Code Online (Sandbox Code Playgroud)