小编Lin*_*oob的帖子

如何在不再次调用 sed 或 awk 的情况下从字符串中删除点字符?

我有一个名为的文件hostlist.txt,其中包含这样的文本:

host1.mydomain.com
host2.mydomain.com
anotherhost
www.mydomain.com
login.mydomain.com
somehost
host3.mydomain.com
Run Code Online (Sandbox Code Playgroud)

我有以下小脚本:

#!/usr/local/bin/bash

while read host; do
        dig +search @ns1.mydomain.com $host ALL \
        | sed -n '/;; ANSWER SECTION:/{n;p;}';
done <hostlist.txt \
        | gawk '{print $1","$NF}' >fqdn-ip.csv
Run Code Online (Sandbox Code Playgroud)

输出到fqdn-ip.csv

host1.mydomain.com.,10.0.0.1
host2.mydomain.com.,10.0.0.2
anotherhost.internal.mydomain.com.,10.0.0.11
www.mydomain.com.,10.0.0.10
login.mydomain.com.,10.0.0.12
somehost.internal.mydomain.com.,10.0.0.13
host3.mydomain.com.,10.0.0.3
Run Code Online (Sandbox Code Playgroud)

我的问题是如何.调用sedgawk再次调用的情况下删除逗号之前的那个?我可以在现有的sedgawk将删除点的调用中执行的步骤吗?

hostlist.txt 将包含 1000 台主机,因此我希望我的脚本快速高效。

sed awk string shell-script regular-expression

12
推荐指数
3
解决办法
4521
查看次数

仅将常规文件传递给 `sed -i`

我正在使用 GNU sed 4.2.2,搜索后无法找出sed在某些情况下行为异常的原因:

我有一个包含以下内容的目录:

foofile.txt
barfile.txt
bazfile.txt
config/
Run Code Online (Sandbox Code Playgroud)

情况1

sed -i 's/foo/bar/g' *.txt
Run Code Online (Sandbox Code Playgroud)

这按我的预期工作。它将三个常规文件中的所有“foo”替换为“bar”。

案例二

sed -i 's/foo/bar/g' *
sed: couldn't edit config: not a regular file
Run Code Online (Sandbox Code Playgroud)

它在barfile.txtand中用“bar”替换了“foo” bazfile.txt,但在 中不替换foofile.txt。我假设它遍历从*字母顺序扩展的文件列表,当它遇到config/错误并退出时。有没有办法sed忽略错误并继续处理文件?

案例3

for file in $(find . -maxdepth 1 -type f); do sed -i 's/foo/bar/g' <"$file"; done
sed: no input files
sed: no input files
sed: no input files
Run Code Online (Sandbox Code Playgroud)

有人可以解释为什么sed会这样吗?为什么在给它一个时说没有输入文件?

我知道我可以使用以下内容,但我问的是为什么 sed 会这样,而不是我如何解决这个用例。

find . …
Run Code Online (Sandbox Code Playgroud)

sed wildcards files

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

标签 统计

sed ×2

awk ×1

files ×1

regular-expression ×1

shell-script ×1

string ×1

wildcards ×1