我希望有一种方法让 sed 用替换(而不仅仅是匹配)替换整行,这样我就可以做这样的事情:
sed -e "/$some_complex_regex_with_a_backref/\1/"
Run Code Online (Sandbox Code Playgroud)
并让它只打印反向引用。
从这个问题来看,似乎这样做的方法是使用正则表达式来匹配整行,或者使用其他工具(如 perl)。简单地更改regexto.*regex.*并不总是有效(如该问题中所述)。例如:
$ echo $regex
\([:alpha:]*\)day
$ echo $phrase
it is Saturday tomorrow
$ echo $phrase | sed "s/$regex/\1/"
it is Satur tomorrow
$ echo $phrase | sed "s/.*$regex.*/\1/"
$ # what I'd like to have happen
$ echo $phrase | [[[some command or string of commands]]]
Satur
Run Code Online (Sandbox Code Playgroud)
假设以下情况,我正在寻找最简洁的方法来做到这一点:
我想在 awk 中连接字符串变量。我怎样才能做到这一点?我试过:
BEGIN{
t="."
r=";"
w=t+r
print w}
Run Code Online (Sandbox Code Playgroud)
但我不工作。输出:
0
Run Code Online (Sandbox Code Playgroud)
或者我想添加变量和函数结果。输入:
t t t t
a t a ta
ata ta a a
Run Code Online (Sandbox Code Playgroud)
脚本:
{
key="t"
print gsub(key,"")#<-it's work
b=b+gsub(key,"")#<- it's something wrong
}
END{
print b}#<-so this is 0
Run Code Online (Sandbox Code Playgroud)
输出:
4
2
2
0#<-the last print
Run Code Online (Sandbox Code Playgroud) 我想根据模式“xÚ”(十六进制为 78 DA)将二进制文件拆分为较小的文件,因此当文件中有“xÚ”时,拆分器脚本会将内容拆分并粘贴到新文件中,直到另一个 '可以找到 xÚ'。新创建的文件应以“xÚ”开头。
FreeBSD awk, grep,sh首选。
我总是使用 awk 来操作逗号分隔的文件,因此我的代码中的第一行总是将字段分隔符更改为“,”,如下所示:
awk 'BEGIN {FS=","}
$2 < 20 {print $1}' myfile.csv
Run Code Online (Sandbox Code Playgroud)
是否可以更改 awk 的默认设置,使逗号成为默认FS?这不是一个大问题,但它只会让事情变得更整洁一些。我尝试谷歌搜索,但没有找到任何有用的东西;这可能是不可能的,但我想我会问!
我想限制 find 命令的输出。过去我曾经用于这个 ls 命令,例如:
ls *tgz|head -100|xargs -i mv "{}" ../
Run Code Online (Sandbox Code Playgroud)
但我知道如果文件名包含换行符,结果可能是不可预测的。所以更正确的方法是这样的:
find ... -print0 | xargs -0
Run Code Online (Sandbox Code Playgroud)
但是采用这种方法我无法使用 head 命令限制 find 的输出 - 它显示所有文件名用 ^@ 特殊符号分隔:
find . -name '*tgz' -print0|head -2|less
Run Code Online (Sandbox Code Playgroud)
file1.tgz^@file2.tgz^@file3.tgz^@file4.tgz^@file5.tgz^@
有没有办法消除这种尴尬?
我试图在 awk 的帮助下解决它:
find . -name 'BATCHED*' -print0|awk 'BEGIN{RS=""}'
Run Code Online (Sandbox Code Playgroud)
但它仍然显示所有或零行。
可以借助awk解决吗?有更好的解决方案吗?
顺便提一句。我发现这个非常有指导意义的参考,但我的问题没有答案。
我正在使用这样的命令来查找其中包含“term”一词的文件:
grep -l term *
Run Code Online (Sandbox Code Playgroud)
但我现在希望能够找到其中包含两个不同单词的文件(我们称它们为 termA 和 termB)——不一定在同一行。我想找到包含两个术语的文件,而不仅仅是具有任一术语的文件。
现在我可以为此编写一个繁琐的 bash 脚本,但是 grep、egrep、awk、sed 或其他任何东西都有可以帮助我的工具吗?
提前致谢。
我有一个包含单词(每行一个)的文件,例如
狗
鱼
猫
鞋
我有一个 CSV 格式的辅助文件,例如
1,鞋子,红色
2,苹果,黑色
3,雾,蓝色
我想使用 grep 将第一个文件作为搜索模式,如果辅助文件中的一行在第一个文件中包含一个单词,我想完全删除辅助文件中的该行。
我不确定 grep 甚至是解决这个问题的方法。
编辑:bash 脚本
我有一个包含 14 个目录的目录结构,其中包含一堆包含三列格式数据的文件(用制表符分隔)。我打算使用 find 和 awk 从每个文件中提取第二列,并使用相同的文件名但在不同的根文件夹下输出它。这是我的目录的草图。
data/all -> AA, AB, AC, AD ...(A* 是包含以 3 列格式存储数据的文件的文件夹,例如 AA100.txt、AA101.txt ...)
我希望修改后的(一列)文件具有相同的名称,但都在一个新的根目录下 data/pos(而不是 data/all/)-> AA、AB、AC、AD ...(再次, 每个包含 A*100.txt, A*101...)
我的尝试是使用 find -exec 并为其提供 awk 命令,但是我在将文件输出到正确的位置时遇到了问题。
当在数据/全部/
find * -type f -exec awk '{print$2}' '{}' > ../pos/'{}' \;
但是 {} 作为输入文件的通配符在输出文件时似乎不起作用?
我究竟做错了什么?(顺便说一句,我在 ubuntu 服务器上)
使用sed到包含某些字符适用于字符串常量使用使文字很简单:
sed "s/\\\\/\\\\\\\\/g"
sed "s/\\\"/\\\\\\\"/g"
Run Code Online (Sandbox Code Playgroud)
但是如何对包含换行符的文本文件做类似的事情呢?
好的,这是一个简单的例子;我分三步隔离主机的 IPV4:
ip -br a
lo UNKNOWN 127.0.0.1/8 ::1/128
eth0 DOWN
wlan0 UP 192.168.0.101/24 fe80::9fcd:45fb:1e0f:a1cc/64
Run Code Online (Sandbox Code Playgroud)
ip -br a | awk '/wlan0/ {print $3}'
192.168.0.101/24
Run Code Online (Sandbox Code Playgroud)
ip -br a | awk '/wlan0/ {print $3}' | awk -F '/' '{print $1}'
192.168.0.101
Run Code Online (Sandbox Code Playgroud)
而不是调用awk(将一个的输出传送到下一个)的第二个实例;怎么能一蹴而就?
只想说:问题不在于解析ip. 我只需要一个简单的例子来帮助说明这个问题;这是我想到的第一件事。真正的问题总结在标题中。
无论如何,它的价值(我必须检查它,但我很确定);这就是我在(最近)过去所做的:
ip -br a s dev wlan0 | awk -F '[ /]*' '{print $3}'
192.168.0.101
Run Code Online (Sandbox Code Playgroud)