通过bash,我试图从文件中提取部分行。
目前我正在使用两个sed命令,如下所示:
sed -n -e "s/^abc=//p" file | sed -n -e "s/\.//gp"
可以接收abc=1.2.3
并吐出123
。这让我想到......我可以通过一个命令调用实现这一目标吗?正如我想在文件中找到与abc=<digit1>\.<digit2>\.<digit3>
匹配的所有字符串并吐出<digit1><digit2><digit3>
。
编辑:
为了澄清,我希望这只打印出匹配的行。例如,如果我有以下文件:
1.2.3.4
abc=quack
qtip=1.2.3
abc=1.2.3
abc = 4.5.6
运行该命令只应打印123
答案 0 :(得分:2)
您可以使用awk
代替.
之后的部分删除abc=
:
awk -F= '$1=="abc"{gsub(/\./, "", $2); print $2}' file
答案 1 :(得分:1)
你可以尝试下面的GNU sed命令是文件中任何位置的字符串abc=<digit1>\.<digit2>\.<digit3>
,
sed -nr 's/.*abc=([0-9])\.([0-9])\.([0-9]).*/\1\2\3/p' file
OR
如果字符串abc=
位于一行的开头,您可以尝试以下sed命令。
sed -nr 's/^abc=([0-9])\.([0-9])\.([0-9]).*/\1\2\3/p' file
示例:强>
$ cat file
abc=1.2.3
foo abc=4.5.6
bar
$ sed -nr 's/.*abc=([0-9])\.([0-9])\.([0-9]).*/\1\2\3/p' file
123
456
$ sed -nr 's/^abc=([0-9])\.([0-9])\.([0-9]).*/\1\2\3/p' file
123
答案 2 :(得分:0)
这是一种使用awk
的方法,它可以处理任意数量的数字,而不仅仅是三个,用句点分隔:
$ echo 'abc=1.2.3.4' | awk -F. -v OFS= '{sub(/.*=/, "", $1); print}'
1234
$ echo 'abc=1.2' | awk -F. -v OFS= '{sub(/.*=/, "", $1); print}'
12
在部分中使用awk
命令:
-F.
使用句点作为字段分隔符。例如,如果输入为abc=1.2
,则awk
会看到两个字段:abc=1
和2
。
-v OFS=
这告诉awk
我们打印出来时不要在字段之间放置任何空格。
sub(/.*=/, "", $1)
这将从行的开头删除abc=
部分。
print
打印出最后一行。
假设我们只想处理以abc=
开头的行,并且只按数字和句点跟踪 。在那种情况下:
$ awk -F. -v OFS= '/^abc=[0-9.]+$/ {sub(/.*=/, "", $1); print}' sample
123
其中sample
是包含更新问题中的样本行的文件的名称。
上面唯一的变化是添加了模式/^abc=[0-9.]+$/
。这限制了后面的命令仅适用于与此正则表达式匹配的行。由于/^abc=[0-9.]+$/
仅匹配以abc=
开头的行,后跟任意数量的句点组合,因此只会处理这些行。不匹配的行将被忽略。
答案 3 :(得分:0)
这应该有效:
sed -E 's/abc=|([0-9])\./\1/g' file
答案 4 :(得分:0)
您也可以简单地使用tr:
$ tr -d [a-z.=] <<< abc=1.2.3
123
编辑:我错过了问题的一部分&#39; 我想找到一个匹配的文件中的所有字符串...... &#39;所以这可能会或可能不会起作用,这取决于其他不需要的行的内容。