相关疑难解决方法(0)

为什么 printf 比 echo 好?

我听说printfecho. 根据我的经验,我只能回忆起一个我不得不使用的实例,printf因为它echo无法将一些文本输入到 RHEL 5.8 上的某个程序中,但printf确实如此。但显然,还有其他差异,我想询问它们是什么以及是否有特定情况下何时使用一种与另一种。

echo text-processing printf

635
推荐指数
4
解决办法
27万
查看次数

为什么使用 shell 循环处理文本被认为是不好的做法?

在 POSIX shell 中使用while 循环来处理文本通常被认为是不好的做法吗?

正如Stéphane Chazelas 所指出的,不使用 shell 循环的一些原因是概念可靠性易读性性能安全性

这个答案解释了可靠性易读性方面:

while IFS= read -r line <&3; do
  printf '%s\n' "$line"
done 3< "$InputFile"
Run Code Online (Sandbox Code Playgroud)

为了性能,从文件或管道读取时,while循环和读取非常慢,因为内置read shell一次读取一个字符。

怎么样的概念安全性方面?

shell text-processing

241
推荐指数
4
解决办法
5万
查看次数

忘记在 bash/POSIX shell 中引用变量的安全隐患

如果您已经关注 unix.stackexchange.com 一段时间了,那么您现在应该知道,echo $var在 Bourne/POSIX shell(zsh 是例外)中的列表上下文(如)中不加引号的变量具有非常特殊的含义,并且除非你有很好的理由,否则不应该这样做。

在这里的许多问答中详细讨论了它(例如:为什么我的 shell 脚本会因空格或其他特殊字符而窒息?何时需要双引号?shell 变量的扩展以及 glob 和 split 对其的影响引用vs 不带引号的字符串扩展)

自从 70 年代末 Bourne shell 首次发布以来就是这种情况,并且没有被 Korn shell 改变(David Korn 最大的遗憾之一(问题 #7))或者bash大部分复制了 Korn shell,这就是POSIX/Unix 是如何指定的。

现在,我们仍然在这里看到许多答案,甚至偶尔会公开发布未引用变量的 shell 代码。你会认为人们现在已经学会了。

根据我的经验,主要有 3 类人会省略引用他们的变量:

  • 初学者。这些可以被原谅,因为它是一种完全不直观的语法。我们在这个网站上的职责是教育他们。

  • 健忘的人。

  • 即使经过反复锤击也不相信的人,他们认为Bourne shell 的作者肯定没有打算让我们引用所有变量

如果我们揭露与此类行为相关的风险,也许我们可以说服他们。

如果您忘记引用变量,那么最糟糕的事情是什么。真的有那么糟糕吗?

我们在这里谈论什么样的漏洞?

在什么情况下会出现问题?

shell security bash shell-script quoting

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

将单独的行转换为带引号条目的逗号分隔列表

我有以下数据(从 Rmarkdown 文件解析的 R 包列表),我想将其转换为可以传递给 R 进行安装的列表:

d3heatmap
data.table
ggplot2
htmltools
htmlwidgets
metricsgraphics
networkD3
plotly
reshape2
scales
stringr
Run Code Online (Sandbox Code Playgroud)

我想将列表转换为以下形式的列表:

'd3heatmap', 'data.table', 'ggplot2', 'htmltools', 'htmlwidgets', 'metricsgraphics', 'networkD3', 'plotly', 'reshape2', 'scales', 'stringr'
Run Code Online (Sandbox Code Playgroud)

我目前有一个从原始文件到上面列表的 bash 管道:

grep 'library(' Presentation.Rmd \
| grep -v '#' \
| cut -f2 -d\( \
| tr -d ')'  \
| sort | uniq
Run Code Online (Sandbox Code Playgroud)

我想添加一个步骤以将新行转换为逗号分隔列表。我试过添加tr '\n' '","',但失败了。我还尝试了以下 Stack Overflow 的一些答案,但也都失败了:

这产生library(stringr)))phics)了结果。

这产生,%了结果。

这个答案(-i去除了标志)产生与输入相同的输出。

linux sed csv tr

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

使用 sed 删除文本文件中的所有新行

我想用 删除文本文件中的所有新行sed,我使用以下代码:

sed -i-o 's/\n//g' mytext.txt
Run Code Online (Sandbox Code Playgroud)

但没有任何变化。我肯定错过了什么...

那是我的 mytext.txt 文件的内容:

1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 …
Run Code Online (Sandbox Code Playgroud)

sed text-processing

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

如何用 sed 替换换行符?

我有需要替换的带有空格(包括换行符)的文本。我想用sed,但AIX似乎并不支持答案sed,我发现换行的问题。我使用的 bash 版本是“GNU bash,版本 3.00.16(1)-release (powerpc-ibm-aix5.1)”

如果我运行一个命令输出一堆文本行,如:

alias:  aliasname
                10:00:00:00:00:00:00:00
Run Code Online (Sandbox Code Playgroud)

使每行一行的最佳方法是什么?如果我使用ssh user@system command | tr '\n' ' ',它会替换两个换行符,我需要保留最后一个,否则输出会变成一行。

编辑:到目前为止我尝试过的是:

  • | sed -e ':1' -e 'N' -e '$!b1' -e 's/\n/ /g' 它替换所有换行符,将整个输出流放入一行。
  • | while read i; do printf "%s " $i; done; echo 这也替换了所有换行符
  • | tr -d '\n'and | tr -d '\n'; echo,它仍然替换所有换行符,但是 echo 在最后一个命令中添加了一个。

sed newlines

5
推荐指数
2
解决办法
3770
查看次数

AWK 与 gsub 上的换行符 \n 不匹配

AWK 不匹配gsub()\n上的换行符。 只想更改下面的“草莓”水果条目。 用 sed 也会很棒。

\n正如您在此脚本中看到的那样,它会忽略:

cat << 'EOF' > ~/src
apple
fruit
strawberry
fruit
orange
fruit
blackberry
EOF
cat << 'EOF' > ~/scp.sh
#!/bin/bash
cat ~/src | awk '{ gsub("strawberry\nfruit", "strawberry\nfruitIsRed"); print }' > ~/trg
EOF
sh ~/scp.sh
diff ~/src ~/trg
# files are equals
Run Code Online (Sandbox Code Playgroud)

awk

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

用 sed 替换换行符(a la tr)

echo "hi,my,name,is" | sed 's/,/\n/g' >out.txt
Run Code Online (Sandbox Code Playgroud)

产量:

hi
my
name
is
Run Code Online (Sandbox Code Playgroud)

但反过来:

sed 's/\n/,/g' out.txt
Run Code Online (Sandbox Code Playgroud)

产量:

hi
my
name
is
Run Code Online (Sandbox Code Playgroud)

为什么不sed通过替换操作的反转来恢复操作?

sed

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

标签 统计

sed ×4

text-processing ×3

shell ×2

awk ×1

bash ×1

csv ×1

echo ×1

linux ×1

newlines ×1

printf ×1

quoting ×1

security ×1

shell-script ×1

tr ×1