根据某些搜索条件替换文件中的字符串是一项非常常见的任务。我怎样才能
foo用bar在当前目录下的所有文件?我听说printf比echo. 根据我的经验,我只能回忆起一个我不得不使用的实例,printf因为它echo无法将一些文本输入到 RHEL 5.8 上的某个程序中,但printf确实如此。但显然,还有其他差异,我想询问它们是什么以及是否有特定情况下何时使用一种与另一种。
我正在编写一个 bash 脚本来查找不存在的文件,然后创建它并将其附加到它:
Host localhost
ForwardAgent yes
Run Code Online (Sandbox Code Playgroud)
所以"line then new line 'tab' then text"我认为它是一种敏感的格式。我知道你可以这样做:
cat temp.txt >> data.txt
Run Code Online (Sandbox Code Playgroud)
但它看起来很奇怪,因为它有两行。有没有办法以这种格式附加它:
echo "hello" >> greetings.txt
Run Code Online (Sandbox Code Playgroud) 说我有一个文件:
# file: 'test.txt'
foobar bash 1
bash
foobar happy
foobar
Run Code Online (Sandbox Code Playgroud)
我只想知道“foobar”后面出现什么词,所以我可以使用这个正则表达式:
"foobar \(\w\+\)"
Run Code Online (Sandbox Code Playgroud)
括号表示我对 foobar 后面的单词特别感兴趣。但是当我执行 a 时grep "foobar \(\w\+\)" test.txt,我得到了与整个正则表达式匹配的整行,而不仅仅是“foobar 之后的单词”:
foobar bash 1
foobar happy
Run Code Online (Sandbox Code Playgroud)
我更希望该命令的输出如下所示:
bash
happy
Run Code Online (Sandbox Code Playgroud)
有没有办法告诉 grep 只输出与正则表达式中的分组(或特定分组)匹配的项目?
我知道这个问题以前可能已经回答过。我在不同的地方看到了很多关于这个的话题,但对我来说通常很难提取答案。我正在寻找有关“sed”命令的示例用法的帮助。
假设我想对文件“hello.txt”(在与提示相同的目录中)进行操作。任何包含“很少”一词的地方,都应改为“asd”。命令会是什么样的?
我想从输出的每一行中删除所有前导和尾随空格和制表符。
有没有一个简单的工具,比如trim我可以将我的输出输入到其中?
示例文件:
test space at back
test space at front
TAB at end
TAB at front
sequence of some space in the middle
some empty lines with differing TABS and spaces:
test space at both ends
Run Code Online (Sandbox Code Playgroud) 在 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一次读取一个字符。
怎么样的概念和安全性方面?
使用版本控制系统时,当差异显示为 时,我对噪音感到恼火No newline at end of file。
所以我想知道:如何在文件末尾添加换行符以摆脱这些消息?
你如何du -sh /dir/*按大小排序?我读过一个网站说使用,| sort -n但这显然是不对的。这是一个错误的例子。
[~]# du -sh /var/* | sort -n
0 /var/mail
1.2M /var/www
1.8M /var/tmp
1.9G /var/named
2.9M /var/run
4.1G /var/log
8.0K /var/account
8.0K /var/crash
8.0K /var/cvs
8.0K /var/games
8.0K /var/local
8.0K /var/nis
8.0K /var/opt
8.0K /var/preserve
8.0K /var/racoon
12K /var/aquota.user
12K /var/portsentry
16K /var/ftp
16K /var/quota.user
20K /var/yp
24K /var/db
28K /var/empty
32K /var/lock
84K /var/profiles
224M /var/netenberg
235M /var/cpanel
245M /var/cache
620M /var/lib
748K /var/spool
Run Code Online (Sandbox Code Playgroud) 我编写了以下脚本来比较两个目录的输出,其中包含所有相同的文件:
#!/bin/bash
for file in `find . -name "*.csv"`
do
echo "file = $file";
diff $file /some/other/path/$file;
read char;
done
Run Code Online (Sandbox Code Playgroud)
我知道还有其他方法可以实现这一目标。奇怪的是,当文件中有空格时,这个脚本会失败。我该如何处理?
find 的示例输出:
./zQuery - abc - Do Not Prompt for Date.csv
Run Code Online (Sandbox Code Playgroud) text-processing ×10
shell ×3
bash ×2
sed ×2
shell-script ×2
awk ×1
command-line ×1
disk-usage ×1
echo ×1
filenames ×1
find ×1
grep ×1
newlines ×1
perl ×1
pipe ×1
printf ×1
scripting ×1
sort ×1
units ×1
whitespace ×1