了解在bash中使用sed的工作

时间:2015-12-06 16:48:44

标签: sed

#!/bin/bash
echo "the first application of sed"
sed -e 's/^\([0-9]\{3\}\)/(\1)/' s.txt
echo "the second application of sed"
sed -e 's/^\([0-9]\{3\}\)/(\1\+\1)/' s.txt
echo "see the original file"
cat s.txt

the first application of sed
(905)-123-3456
(905)-124-3456
(905)-125-3456
(905)-126-3456
(905)-127-3456
the second application of sed
(905+905)-123-3456
(905+905)-124-3456
(905+905)-125-3456
(905+905)-126-3456
(905+905)-127-3456
see the original file
905-123-3456
905-124-3456
905-125-3456
905-126-3456
905-127-3456

我刚刚开始进行shell编程,最近2个小时我一直坚持使用这段代码。我知道sed的基本用法,但我无法弄清楚该行

sed -e 's/^\([0-9]\{3\}\)/(\1)/' s.txt

一样。我知道 - 是表达,s是替代。 ^表示行的开头,但之后的部分令人困惑。有什么想法吗?

2 个答案:

答案 0 :(得分:3)

最终,它是手动抨击练习。

  • \(标志着捕获的开始,直到平衡\) - 它们可以嵌套,但这些不是。
  • \{标记重复规范的开始,直到以下\} - 它们无法嵌套。在这种情况下,您有\{3\},因此这会重复上一项[0-9]三次。
  • 替换中的\1是指搜索模式中第一个\(捕获的材料。

因此:

s/^\([0-9]\{3\}\)/(\1)/

将括号中该行开头的三位数包裹起来 - 如输出中所示。因为它是锚定的,它只发生一次。如果一行不以三位数字开头,则该命令不会对该行产生任何影响。

第二个例子只是略有不同。它在行的开头取三个数字的序列,并用该序列替换它,+标记和序列,全部用括号括起来 - 如输出中所示。

s///命令的替换部分中的元字符相对较少;搜索部分中有很多元字符。此外,搜索部分中有不同的方言 - sed的一些变体支持'扩展正则表达式'而不是'基本正则表达式'(这是您的示例使用的);其他人支持类似Perl的表达式(不完全是PCRE - Perl兼容正则表达式 - 据我所知,但有一些来自PCRE的表示法)。为此,您需要阅读您正在使用的sed手册。

答案 1 :(得分:2)

让我们打破这个:

sed -e 's/^\([0-9]\{3\}\)/(\1)/' s.txt

sed替代品的命名是这样的:

s/search/replace/options

在您的情况下,search部分为^\([0-9]\{3\}\)。括号和大括号可以具有特殊含义,它们由\转义。如果我们为理解目的删除它们,它的外观就是这样:

^([0-9]{3})

这意味着 - 该行应该以0到9之间的数字开头,并且应该重复3次。所以基本上,它是一个3位数字(例如123,543等)。

括号()将3位数字分组,可以称为第一组。

替换部分为(\1)。这意味着,我们在搜索中捕获的组被反刍。