#!/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是替代。 ^表示行的开头,但之后的部分令人困惑。有什么想法吗?
答案 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)
。这意味着,我们在搜索中捕获的组被反刍。