我如何粘贴来自命令(typescript;“man script”)的输出script
,以使其更具可读性?
Script started on 2017-10-27 06:20:56-0700
]0;thufir@dur: ~/IdeaProjects[01;32mthufir@dur[00m:[01;34m~/IdeaProjects[00m$
]0;thufir@dur: ~/IdeaProjects[01;32mthufir@dur[00m:[01;34m~/IdeaProjects[00m$ tree
[01;34m.[00m
├── kotlin
└── [01;34mkotlinHelloWorld[00m
├── kotlinHelloWorld.iml
├── [01;34mout[00m
│ └── [01;34mproduction[00m
│ └── [01;34mkotlinHelloWorld[00m
└── [01;34msrc[00m
└── Main.kt
5 directories, 3 files
]0;thufir@dur: ~/IdeaProjects[01;32mthufir@dur[00m:[01;34m~/IdeaProjects[00m$
]0;thufir@dur: ~/IdeaProjects[01;32mthufir@dur[00m:[01;34m~/IdeaProjects[00m$ cat kotlinHelloWorld/src/Main.kt
class Main {
fun main(args: Array<String>) {
println("Hello, world!")
}
}]0;thufir@dur: ~/IdeaProjects[01;32mthufir@dur[00m:[01;34m~/IdeaProjects[00m$
]0;thufir@dur: ~/IdeaProjects[01;32mthufir@dur[00m:[01;34m~/IdeaProjects[00m$ exit
exit
Script done on 2017-10-27 06:21:19-0700
在这种情况下,乱码(?)反映了gnome-terminal
颜色。是的,通过使用不同的 shell、不同的控制台等,可以不生成这种“乱码”。问题是如何巧妙地让命令script
不记录它们,或者让pastebin
实用程序(或类似程序,例如gist-paste
)“很好地”处理它们。
首先,感谢您的回复。其次,我希望这不会混淆视听:
thufir@dur:~$
thufir@dur:~$ script trying_to_eliminate_control_chars.txt
Script started, file is trying_to_eliminate_control_chars.txt
thufir@dur:~$
thufir@dur:~$ echo "hi"
hi
thufir@dur:~$
thufir@dur:~$ echo "hi"
hi
thufir@dur:~$
thufir@dur:~$ echo "hmm"
hmm
thufir@dur:~$
thufir@dur:~$ exit
exit
Script done, file is trying_to_eliminate_control_chars.txt
thufir@dur:~$
thufir@dur:~$ cat trying_to_eliminate_control_chars.txt > foo.txt
thufir@dur:~$
thufir@dur:~$ cat foo.txt
Script started on 2017-10-31 17:51:29-0700
thufir@dur:~$
thufir@dur:~$ echo "hi"
hi
thufir@dur:~$
thufir@dur:~$ echo "hi"
hi
thufir@dur:~$
thufir@dur:~$ echo "hmm"
hmm
thufir@dur:~$
thufir@dur:~$ exit
exit
Script done on 2017-10-31 17:51:47-0700
thufir@dur:~$
thufir@dur:~$ cat trying_to_eliminate_control_chars.txt
Script started on 2017-10-31 17:51:29-0700
thufir@dur:~$
thufir@dur:~$ echo "hi"
hi
thufir@dur:~$
thufir@dur:~$ echo "hi"
hi
thufir@dur:~$
thufir@dur:~$ echo "hmm"
hmm
thufir@dur:~$
thufir@dur:~$ exit
exit
Script done on 2017-10-31 17:51:47-0700
thufir@dur:~$
thufir@dur:~$ pastebin foo.txt
pastebin: command not found
thufir@dur:~$
thufir@dur:~$ pastebinit foo.txt
http://paste.ubuntu.com/25862228/
thufir@dur:~$
虽然你可能天真地期望多于粘贴不是要有控制字符,它做。这是因为终端本身(或者我推断)正在处理/隐藏它们。
非常低级的文本文件等在起作用。此外还有关于终端仿真如何工作的非常详细的知识。坦率地说,这有点超出我的理解范围。
答案1
我已经测试了下面参考资料中提供的所有解决方案,以处理和清理命令的输出文件script
来自特殊字符。
在我的 Ubuntu 16.04 上,只有以下解决方案才能提供令人满意的结果:
perl -pe 's/\e([^\[\]]|\[.*?[a-zA-Z]|\].*?\a)//g' typescript | col -b > typescript.new
或者您可以将输出直接通过管道传输到上传客户端程序:
perl -pe 's/\e([^\[\]]|\[.*?[a-zA-Z]|\].*?\a)//g' typescript | col -b | pastebinit
上述命令与 一起使用pastebinit
,因此请安装它:
sudo apt install pastebinit
参考:
- 答案的主要来源
- 使用 sed 删除颜色代码(特殊字符)
- 如何从标准输出中去除颜色代码并通过管道传输到文件和标准输出
- 从文本流中删除 ANSI 颜色代码
- 从脚本输出中删除控制字符(包括控制台代码/颜色)
- 如何在当前终端会话中设置区域设置?
创建“脚本到 pastebin”自定义命令 - spaste
我建议根据上述解决方案创建一个自定义命令。我们将其命名为斯帕斯特。
1.创建可执行脚本文件,名为spaste
,位于 ,/usr/local/bin
可以作为 shell 命令访问:
sudo touch /usr/local/bin/spaste
sudo chmod +x /usr/local/bin/spaste
sudo nano /usr/local/bin/spaste
- 复制以下脚本。然后输入
nano
:粘贴Shift Ins;保存CtrlO Enter;退出CtrlX。
#!/bin/bash
# Name: spaste
# Location: /usr/local/bin
#export LC_ALL=C
# If the first input parameter is option - see: script --help; or type `script --help`
[[ "${1}" =~ -.* ]] && TARGET_FILE="$2" || TARGET_FILE="$1"
# If the variable $TARGET_FILE is empty, use the default output file name
[[ -z "${TARGET_FILE}" ]] && TARGET_FILE="typescript"
# The main function - Remove color codes, etc.
script_remove_extras() {
script "$@"
perl -pe 's/\e([^\[\]]|\[.*?[a-zA-Z]|\].*?\a)//g' "$TARGET_FILE" | col -b > "/tmp/$USER-cpaste-$TARGET_FILE.tmp"
cp "/tmp/$USER-cpaste-$TARGET_FILE.tmp" "$TARGET_FILE"
}
# Upload to 'pastebinit'
upload_pastebinit() { pastebinit < "$TARGET_FILE"; }
# GUI mode with 'chromium' or 'firefox'; CLI mode with 'lynx'; Just upload with 'pastebinit'; Just clear the outputfile
if [ "$SPASTE_MODE" == "chromium" ]; then
script_remove_extras "$@"; nohup chromium-browser "$(upload_pastebinit)" >/dev/null 2>&1 &
elif [ "$SPASTE_MODE" == "firefox" ]; then
script_remove_extras "$@"; nohup firefox "$(upload_pastebinit)" >/dev/null 2>&1 &
elif [ "$SPASTE_MODE" == "lynx" ]; then
script_remove_extras "$@"; lynx "$(upload_pastebinit)"
elif [ "$SPASTE_MODE" == "upload" ]; then
script_remove_extras "$@"; upload_pastebinit
else
script_remove_extras "$@"
fi
2.解释:
当您执行新命令时,
spaste
它将调用该命令script
并为其分配用户的输入参数。因此,调用语法与命令相同script
- 请参阅script --help
或键入spaste --help
以了解更多详细信息:Usage: spaste (script) [options] [file] Make a typescript of a terminal session. Options: -a, --append append the output -c, --command <command> run command rather than interactive shell -e, --return return exit code of the child process -f, --flush run flush after each write --force use output file even when it is a link -q, --quiet be quiet -t, --timing[=<file>] output timing data to stderr (or to FILE) -V, --version output version information and exit -h, --help display this help and exit
当你键入
exit
退出命令会话时script
,将处理该命令spaste
的输出文件。script
pastebinit
结果将返回到输出文件
pastebinit
的上传内容的链接。script
新命令
spaste
有几种不同的模式来处理 返回的链接。 可以在执行命令之前pastebinit
通过导出具有不同值的变量来切换这些模式:$SPASTE_MODE
spaste
$ export SPASTE_MODE= $ spaste
可用的模式有:
SPASTE_MODE=chromium
- 将在 Chromium 中打开返回的链接。SPASTE_MODE=firefox
- 将在 FireFox 中打开返回的链接。SPASTE_MODE=lynx
- 将打开返回的链接 Lynx(终端浏览器)。SPASTE_MODE=upload
- 只会输出返回的链接。SPASTE_MODE=
- 不会返回链接;只会处理输出文件的内容。
您可以从
~/.bashrc
文件中导出您最喜欢的模式,例如在其底部添加以下行:export SPASTE_MODE=firefox
3.使用演示:
答案2
我认为这不是您想要的答案,但它确实有效:
运行script
并创建typescript
文件后,运行cat typescript
。所有转义序列都被终端使用,因此输出是彩色纯文本。手动复制(使用鼠标),它将以纯文本形式保存到剪贴板中。粘贴到需要的地方。