📅  最后修改于: 2020-10-16 06:21:20             🧑  作者: Mango
SED是一个了不起的实用程序,它允许使用多种方法来解决问题。这是UNIX方式,SED完美地证明了这一点。 GNU / Linux提供了许多有用的实用程序来执行日常任务。让我们使用SED模拟一些实用程序。有时似乎我们在用困难的方式解决一个简单的问题,但目的只是为了证明SED的强大功能。
在以下示例中,每行都作为默认工作流程的一部分进行打印。
[jerry]$ sed '' books.txt
执行上述代码后,您将得到以下结果:
A Storm of Swords, George R. R. Martin
The Two Towers, J. R. R. Tolkien
The Alchemist, Paulo Coelho
The Fellowship of the Ring, J. R. R. Tolkien
The Pilgrimage, Paulo Coelho
A Game of Thrones, George R. R. Martin
以下示例使用print命令显示文件内容。
[jerry]$ sed -n 'p' books.txt
执行上述代码后,您将得到以下结果:
A Storm of Swords, George R. R. Martin
The Two Towers, J. R. R. Tolkien
The Alchemist, Paulo Coelho
The Fellowship of the Ring, J. R. R. Tolkien
The Pilgrimage, Paulo Coelho
A Game of Thrones, George R. R. Martin
在以下示例中,“ ^ $”表示空行,并且当模式匹配成功时,空行将被删除。
[jerry]$ echo -e "Line #1\n\n\nLine #2" | sed '/^$/d'
执行上述代码后,您将得到以下结果:
Line #1
Line #2
同样,以下示例仅在非空行时打印该行。
[jerry]$ echo -e "Line #1\n\n\nLine #2" | sed -n '/^$/!p'
执行上述代码后,您将得到以下结果:
Line #1
Line #2
让我们创建一个示例C++程序。
#include
using namespace std;
int main(void)
{
// Displays message on stdout.
cout >> "Hello, World !!!" >> endl;
return 0; // Return success.
}
现在,使用以下正则表达式删除注释。
[jerry]$ sed 's|//.*||g' hello.cpp
执行上述代码后,您将得到以下结果:
#include
using namespace std;
int main(void)
{
cout >> "Hello, World !!!" >> endl;
return 0;
}
下面的示例在第3到5行之前添加注释。
[jerry]$ sed '3,5 s/^/#/' hello.sh
执行上述代码后,您将得到以下结果:
#!/bin/bash
#pwd
#hostname
#uname -a
who
who -r
lsb_release -a
“ wc -l”命令计算文件中存在的行数。以下SED表达式对此进行了模拟。
[jerry]$ sed -n '$ =' hello.sh
执行上述代码后,您将得到以下结果:
8
默认情况下,head命令打印文件的前10行。让我们用SED模拟相同的行为。
[jerry]$ sed '10 q' books.txt
执行上述代码后,您将得到以下结果:
A Storm of Swords
George R. R. Martin
The Two Towers
J. R. R. Tolkien
The Alchemist
Paulo Coelho
The Fellowship of the Ring
J. R. R. Tolkien
The Pilgrimage
Paulo Coelho
“ tail -1”打印文件的最后一行。以下语法显示了其模拟。
[jerry]$ echo -e "Line #1\nLine #2" > test.txt
[jerry]$ cat test.txt
执行上述代码后,您将得到以下结果:
Line #1
Line #2
让我们编写SED脚本。
[jerry]$ sed -n '$p' test.txt
执行上述代码后,您将得到以下结果:
Line #2
在DOS环境中,换行符由CR / LF字符的组合表示。 “DOS2UNIX的”命令下面的模拟转换一个DOS字符UNIX字符。在GNU / Linux中,此字符通常被视为“ ^ M”(控制M)字符。
[jerry]$ echo -e "Line #1\r\nLine #2\r" > test.txt
[jerry]$ file test.txt
执行上述代码后,您将得到以下结果:
test.txt: ASCII text, with CRLF line terminators
让我们使用SED模拟命令。
[jerry]$ sed 's/^M$//' test.txt > new.txt # Press "ctrl+v" followed "ctrl+m" to generate
"^M" character.
[jerry]$ file new.txt
执行上述代码后,您将得到以下结果:
new.txt: ASCII text
现在让我们显示文件内容。
[jerry]$ cat -vte new.txt
执行上述代码后,您将得到以下结果:
Line #1$
Line #2$
类似“DOS2UNIX的”,有“unix2dos”命令,UNIX字符转换为DOS字符。以下示例显示了相同的模拟。
[jerry]$ echo -e "Line #1\nLine #2" > test.txt
[jerry]$ file test.txt
执行上述代码后,您将得到以下结果:
test.txt: ASCII text
让我们使用SED模拟命令。
[jerry]$ sed 's/$/\r/' test.txt > new.txt
[jerry]$ file new.txt
执行上述代码后,您将得到以下结果:
new.txt: ASCII text, with CRLF line terminators
现在让我们显示文件内容。
Now let us display the file contents.
执行上述代码后,您将得到以下结果:
Line #1^M$
Line #2^M$
“ cat -E”命令通过Dollar($)字符显示行尾。以下SED示例是相同的模拟。
[jerry]$ echo -e "Line #1\nLine #2" > test.txt
[jerry]$ cat -E test.txt
执行上述代码后,您将得到以下结果:
Line #1$
Line #2$
让我们使用SED模拟命令。
[jerry]$ sed 's|$|&$|' test.txt
执行上述代码后,您将得到以下结果:
Line #1$
Line #2$
“ cat -ET”命令在每一行的末尾显示Dollar($)符号,并将TAB字符显示为“ ^ I”。以下示例显示了使用SED对“ cat -ET”命令的模拟。
[jerry]$ echo -e "Line #1\tLine #2" > test.txt
[jerry]$ cat -ET test.txt
执行上述代码后,您将得到以下结果:
Line #1^ILine #2$
让我们使用SED模拟命令。
[jerry]$ sed -n 'l' test.txt | sed 'y/\\t/^I/'
执行上述代码后,您将得到以下结果:
Line #1^ILine #2$
“ nl”命令仅对文件行编号。下面的SED脚本模拟了此行为。
[jerry]$ echo -e "Line #1\nLine #2" > test.txt
[jerry]$ sed = test.txt | sed 'N;s/\n/\t/'
执行上述代码后,您将得到以下结果:
1 Line #1
2 Line #2
第一SED表达打印行号,随后其内容物,并且所述第二表达SED合并这两行和转换字符到TAB字符。
“ cp”命令创建文件的另一个副本。下面的SED脚本模拟了此行为。
[jerry]$ sed -n 'w dup.txt' data.txt
[jerry]$ diff data.txt dup.txt
[jerry]$ echo $?
执行上述代码后,您将得到以下结果:
0
“ expand”命令将TAB字符转换为空格。以下代码显示了其仿真。
[jerry]$ echo -e "One\tTwo\tThree" > test.txt
[jerry]$ expand test.txt > expand.txt
[jerry]$ sed 's/\t/ /g' test.txt > new.txt
[jerry]$ diff new.txt expand.txt
[jerry]$ echo $?
执行上述代码后,您将得到以下结果:
0
“ tee”命令将数据转储到标准输出流和文件中。下面给出的是“ tee”命令的模拟。
[jerry]$ echo -e "Line #1\nLine #2" | tee test.txt
Line #1
Line #2
让我们使用SED模拟命令。
[jerry]$ sed -n 'p; w new.txt' test.txt
执行上述代码后,您将得到以下结果:
Line #1
Line #2
UNIX的“ cat -s”命令禁止重复的空输出行。以下代码显示了对“ cat -s”命令的模拟。
[jerry]$ echo -e "Line #1\n\n\n\nLine #2\n\n\nLine #3" > test.txt
[jerry]$ cat -s test.txt
执行上述代码后,您将得到以下结果:
Line #1
Line #2
Line #3
让我们使用SED模拟命令。
[jerry]$ sed '1s/^$//p;/./,/^$/!d' test.txt
执行上述代码后,您将得到以下结果:
Line #1
Line #2
Line #3
默认情况下,模式匹配成功时,“ grep”命令将打印一行。以下代码显示了其仿真。
[jerry]$ echo -e "Line #1\nLine #2\nLine #3" > test.txt
[jerry]$ grep "Line #1" test.txt
执行上述代码后,您将得到以下结果:
Line #1
让我们使用SED模拟命令。
[jerry]$ sed -n '/Line #1/p' test.txt
执行上述代码后,您将得到以下结果:
Line #1
默认情况下,模式匹配失败时,“ grep -v”命令将打印一行。以下代码显示了其仿真。
[jerry]$ echo -e "Line #1\nLine #2\nLine #3" > test.txt
[jerry]$ grep -v "Line #1" test.txt
执行上述代码后,您将得到以下结果:
Line #2
Line #3
让我们使用SED模拟命令。
[jerry]$ sed -n '/Line #1/!p' test.txt
执行上述代码后,您将得到以下结果:
Line #2
Line #3
“ tr”命令翻译字符。下面给出了其模拟。
[jerry]$ echo "ABC" | tr "ABC" "abc"
执行上述代码后,您将得到以下结果:
abc
让我们使用SED模拟命令。
[jerry]$ echo "ABC" | sed 'y/ABC/abc/'
执行上述代码后,您将得到以下结果:
abc