使用sed / regex进行bash字符串操作

时间:2014-08-01 19:35:16

标签: regex bash sed

通过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

5 个答案:

答案 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=12

  • -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;所以这可能会或可能不会起作用,这取决于其他不需要的行的内容。