小编hig*_*guy的帖子

临时数据的伪文件

我经常想将相对较短的字符串数据(虽然可能是几行)提供给命令行程序,这些程序只以重复的方式接受来自文件(例如 wdiff)的输入。当然我可以创建一个或多个临时文件,将字符串保存在那里,然后以文件名作为参数运行命令。但在我看来,如果数据实际写入磁盘,则此过程的效率会非常低,而且如果我多次重复此过程(例如,如果我想提供单行长文本),它可能会对磁盘造成不必要的伤害文件到 wdiff。有没有推荐的方法来规避这种情况,比如通过使用诸如管道之类的伪文件来临时存储数据而不实际将其写入磁盘(或仅在超过临界长度时才将其写入)。请注意, wdiff 有两个参数,并且,wdiff <"text".

bash pipe files

123
推荐指数
3
解决办法
7万
查看次数

避免因未扩展的星号而导致的错误

在 bash 中,我经常使用 for 循环,如下所示

for file in *.type; do 
  sommecommand "$file"; 
done;
Run Code Online (Sandbox Code Playgroud)

对所有匹配的文件执行操作*.type。如果在工作目录中没有找到具有此结尾的文件,则星号不会展开,通常我会收到一条错误消息,指出 somecommand 没有找到该文件。我可以立即想到几种方法来避免这个错误。但是添加一个条件似乎不是很优雅。有没有一种简短而干净的方法来实现这一目标?

bash wildcards for

20
推荐指数
3
解决办法
3940
查看次数

如何处理选项结束——在 getopts 中

我使用 getopts 将 bash 脚本中的参数解析为

while getopts ":hd:" opt; do
  case $opt in
    d ) echo "directory = $OPTARG"; mydir="$OPTARG"; shift $((OPTIND-1)); OPTIND=1 ;;
    h ) helptext
      graceful_exit ;;
    * ) usage
      clean_up
      exit 1
  esac
done

exeparams="$*"
Run Code Online (Sandbox Code Playgroud)

exeparams将保存任何未解析的选项/参数。因为我想使用 exeparams 来保存要在脚本中执行的命令的选项(它可以与脚本自己的选项重叠),所以我想使用 -- 来结束传递给脚本的选项。如果我通过例如

myscript -d myscriptparam -- -d internalparam
Run Code Online (Sandbox Code Playgroud)

exeparams 将举行

-- -d internalparam
Run Code Online (Sandbox Code Playgroud)

我现在想删除--将这些参数传递给内部命令的前导。有没有一种优雅的方法来做到这一点,或者我可以获得一个只包含其余部分而不--来自 getopts的字符串?

bash getopts

10
推荐指数
2
解决办法
1万
查看次数

Bash globbing 和参数传递

我有以下简化的 bash 脚本

#!/bin/bash

files=("$@")

if [ "X$files" = "X" ]; then
  files=$HOME/print/*.pdf;
fi

for file in "${files[@]}"; do
  ls "$file";
done
Run Code Online (Sandbox Code Playgroud)

如果我将参数(文件名)作为参数传递,该脚本将打印正确的文件名。另一方面,如果我不传递参数,它会打印

/home/user/print/*.pdf: No such file or directory
Run Code Online (Sandbox Code Playgroud)

为什么在这种情况下文件名没有扩展,我该如何解决?请注意,我使用files=("$@")and"${files[@]}"结构是因为我读到它比通常的“files=$*”更受欢迎。

bash wildcards arguments glob

8
推荐指数
1
解决办法
2万
查看次数

连接具有重复开头的文本行

我有一个长文本文件(stardict-editor 的标签文件),它由以下格式的行组成:

word1  some text
word1  some other text
word2  more text
word3  even more
Run Code Online (Sandbox Code Playgroud)

并想将其转换为

word1  some text<br>some other text
word2  more text
word3  even more
Run Code Online (Sandbox Code Playgroud)

这意味着以相同单词开头的后续行(文件已排序)应合并为一个(此处定义用 分隔<br>)。具有相同开头的行也可以出现不止两次。分隔单词和定义的字符是制表符,每行都是唯一的。word1, word2,word3当然是我事先不知道的任意内容(制表符和换行符除外)的占位符。

我可以想到一段较长的 Perl 代码来执行此操作,但想知道 Perl 中是否有简短的解决方案或命令行的某些内容。有任何想法吗?

command-line text-processing

7
推荐指数
2
解决办法
5037
查看次数

用任意新文本替换文本文件中的标记

我有一个文件,其中包含一些文本和 - 在一行中 - 一个标记,指示应在何处添加新内容

foo
bar
%SUBSTITUTE%
foo
Run Code Online (Sandbox Code Playgroud)

行行替换应该由一个新的多行字符串替换text="some text"(请注意,我不知道该字符串可能是例如读取文件text=cat "file"`` 的结果)。替换的结果应该是

foo
bar
some text
%SUBSTITUTE%
foo
Run Code Online (Sandbox Code Playgroud)

我有一个基于perl它停止工作的工作版本(显然是由于 perl 版本更改)。现在我正在尝试像tr和那样的标准实用程序sed来替换该行。我遇到了一些麻烦,因为要粘贴的字符串可能包含任意字符,包括反斜杠等。我不想在粘贴之前转义这些字符。

有没有一种安全的方法可以使用标准工具来做到这一点?我为该问题找到的其他问题是已知要粘贴的文本的特定解决方案。

sed awk text-processing

5
推荐指数
1
解决办法
1667
查看次数

下载大 imap 目录到 maildir

我搜索了一个解决方案,通过 imap 从邮件服务器下载(用于存档)大型邮件目录,并将所有邮件存储在本地邮件目录中。我需要一个强大的解决方案,如果发生超时,它会反复尝试。到目前为止,我已经尝试使用常规邮件客户端来实现此目的。显然,服务器限制下载的方式使我迄今为止尝试过的客户端感到困惑,因为他们最终放弃甚至丢失了邮件。我正在考虑像 fetchmail 这样的工具,但是我看到的操作方法要么有点长,要么不完全符合我的需求,例如http://llg.cubic.org/docs/imapbackup.html描述了下载到mbox 文件。我仍然不清楚是否支持 maildir 格式。

email imap fetchmail

5
推荐指数
1
解决办法
3023
查看次数

如何检测同一网络中给定设备的IP

I have a very typical situation in which I want to connect an (android) phone to a linux notebook in the same (wifi) network using ssh. The IP's are assigned by DHCP so I know only the one of the client in advance. Knowing the IP of the client I could in principle loop a ssh command over all possible IP's in the same net to see if a server is listening there. However this seems highly inefficient. So, how …

linux networking wifi ssh

3
推荐指数
1
解决办法
1907
查看次数