【问题标题】:How to truncate after [[:space:]] && '(' in BASH scripting? [closed]如何在 BASH 脚本中 [[:space:]] && '(' 之后截断?[关闭]
【发布时间】:2018-10-23 08:29:24
【问题描述】:

感谢你们的帮助; cut 命令仅在单个字符搜索后截断[将行分成字段],因此在某些情况下它不如 sed 有用 这里 cut -d ' ' -f1 // -d ' ' 使用空格作为将行拆分为字段的位置,由 -f# 表示,使用 -d '-' 溢出 man -k 。用 | 进入可用的 f1 和 f2像这样我不确定是什么 &| 2?> 的意思是它以某种方式将返回值传递给下一个函数。我不知道为什么这很有用。 人-k。 &| cut -d '-' -f2 应该得到命令的描述

虽然 grep -o 看起来很有用 grep -v 似乎坏了 tr 和 split 命令似乎没用,因为我似乎可以通过管道将数据传入/传出该命令

我一直在尝试在空格后截断行输入,但我并没有真正得到我想要的结果。我试过 split sec cat tr 命令,但我还不能解析数据文件。使用man bash 并在那里我发现了 sys 变量IFS="" 我将其设置为默认值。在bash -i 交互模式下,我没有看到任何积极的结果。设置 IFS 后,我在使用 '>' 进行管道传输时会出现不明确的重定向错误。

基本上尝试这个命令:

man -k [:alnum:] > $HOME/Documents/fcList.txt && shuf -n 1 $HOME/Documents/fcList.txt

我想解析fcList.txt 以在[[:space:]] 之前加上行号或人的第一个单词。这样我就可以查看一个随机的手册页条目并学习一些东西。即使在鼠标垫文本编辑器中,我也无法找到以"[[:space:]](*"" (" 开头的字符串并将其替换为行尾。

到目前为止,我已经四处搜索并尝试了 IRC #BASH,但没有任何帮助。这看起来很有希望

IFS=: read -ra arr < <(grep "^$USER:" /etc/passwd)
for a in "${arr[@]}"; do echo "[$a]"; done

但是,这样做我的元素是这样分解的:

[Text] 
[] 
[Levenshtein (3pm) - calculate the Levenshtein edit distance between two...]

我基本上想提取 Levenshtein 部分并将其作为“man Levenshtein”运行以完成我的 ranman 脚本。

此命令不起作用 -m 1 表示查找第一个匹配项

cat $HOME/Documents/out.txt | grep -m 1 ^.[[\(]*.[[:alnum:]]?.[\)].*[[:space:]].*[[:alnum:]]]

?^*# 字符是否应该在 . 之后(这是串联吗?) 据我了解,^ 不是,* 表示多个字母,而? 表示一次匹配——c[ao]t 既是 cat 又是 cot

还尝试了括号不帮助我将 out.txt 发送到 grep 命令

cat $HOME/Documents/out.txt | ( grep -m 1 .^[[\(].*[[:alnum:]].?[\)]*.[[:space:]]*.[[:alnum:]]] )

有一个名为 accessdb 的命令试图解析 var/cache/man/index.db 它可能有其他命令来帮助 wc 高于 apropos 。或 man -k ''

谢谢大家 -- 但是虽然我的目标已经通过您的有用答案实现了,但我仍然不知道如何使用 sed 或 grep 正确截断。我猜是 。在 Linux 中不是串联。我可能已经通过 cut 学到了足够的知识来制作包含以下字段的 dat 文件? a b c d ... ~correctAnswer 我想学习 [0 ... MAX] 格式我想我可以制作一个多选提问者 dat 文件。也许稍后尝试将命令与描述相匹配。

最后,我想研究 ZeVeRoH,它就像线性代数与数独的混合,一切都加到零,你必须在矩阵中选择 +/-。

【问题讨论】:

  • 请问您能edit您的问题以改进格式吗?
  • 我试图清理一下您的帖子,但遗憾的是您的帖子确实令人困惑且不清楚。你能试着分解你的问题并写下一个清晰的问题陈述吗? (1) 这就是我想要的 (2) 这是我卡住的地方 (3) 这是我尝试过的 (4) 这是我的输入 (5) 这是我得到的输出 (6) 这是是我想要的输出。 minimal reproducible example
  • 我编辑了它。是的,它令人困惑,但非常有帮助的 man bash 冗长也是如此。

标签: bash shell ubuntu truncate


【解决方案1】:

要显示一个随机的man 页面,您可以使用

man "$(man -k . | cut -d' ' -f1 | shuf -n1)"

在某些 BSD 系统上,您可以使用 shuffle -p2 -f- 代替 shuf -n1

作为快捷方式,您可以将以下内容添加到您的~/.bashrc

alias rdman='man "$(man -k . | cut -d" " -f1 | shuf -n1)"'

【讨论】:

  • man -k * 中的 * 将扩展文件 glob?
  • 它在我的系统上不起作用,因为* get 扩展并替换了当前目录中的所有文件,并且 man 只显示使用页面。但是man -k '' 运行良好。
  • 感谢您的提示!找到了我认为man -k * 有效的原因。在我的主目录中,有Documents 之类的文件夹。这些也是出现在许多手册页中的关键字。所以我的主目录中的man -k *man -k Documents Downloads ...,它与很多手册页匹配。
  • 它在我的 ubuntu 系统上工作,但我无法符号链接或 ln 它,因为空格被解析为命令的变量也许与 IFS 变量混淆可能会有所帮助?但对我来说,只有“
  • @Punkroku 你想符号链接什么?如果您想要该命令的快捷方式,请将其定义为 .bashrc 中的别名:alias randman='man "$(man -k . | cut -d\ -f1 | shuf -n1)"'。顺便说一句,Kamil Cuk 写了''(两个单引号,没有空格),而不是" "(引号空格)。
【解决方案2】:

获取随机手册页尝试

man -k [:alnum:] | shuf -n 1 | sed -e 's/[[:space:]].*//;s/^/man /'

直接执行是通过

$(man -k [:alnum:] | shuf -n 1 | sed -e 's/[[:space:]].*//;s/^/man /')

man $(man -k [:alnum:] | shuf -n 1 | sed -e 's/[[:space:]].*//')

要更改您的文件尝试

sed -i -e 's/[[:space:]].*//;s/^/man /' $HOME/Documents/fcList.txt

只需在每一行前面添加

sed -i -e 's/^/man /' $HOME/Documents/fcList.txt

并在前面放一个行号

awk '/^/ {print i" "$0;i++}' $HOME/Documents/fcList.txt

gawksince version 4.1 可以内联

gawk -i inplace '/^/ {print i" "$0;i++}' $HOME/Documents/fcList.txt

【讨论】:

  • @punkroku 然后就是$(man -k [:alnum:] | shuf -n 1 | sed -e 's/[[:space:]].*//;s/^/man /')
  • sed 实际上对我来说似乎有点矫枉过正。 man "$(man -k [:alnum:] | shuf -n1 | cut -f1 -d' ')" 应该可以。
  • man -k .man -k '' 是这样。在我的系统上 man -k [:alnum:] | wc -l -> 1457 行,man -k . | wc -l -> 23955 行。
  • grymoire.com/Unix/Sed.html 是一个很好的 sed 脚本介绍
  • 没有。 stackoverflow 不是学习网站。抓住this site,太棒了。如果您想了解正则表达式,regex crosswords 将让您在几秒钟内到达那里。 ^ 表示该行的开头。 /// 不是扩展,但s 是 sed 替代命令,s/&lt;regex&gt;/&lt;regex&gt;/ 是 sed 脚本中最常用的命令。
猜你喜欢
  • 1970-01-01
  • 2010-10-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-27
  • 2016-08-06
相关资源
最近更新 更多