SED是一个了不起的实用程序,它允许使用多种方法来解决问题。这是UNIX方式,SED完美地证明了这一点。 GNU/Linux提供了许多有用的实用程序来执行日常任务,让我们使用SED模拟一些实用程序。
在以下示例中,每行都作为默认工作流程的一部分进行打印。
$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命令显示文件内容。
$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
在以下示例中," ^ $"表示空行,并且当模式匹配成功时,空行将被删除。
$echo -e "Line #1\n\n\nLine #2" | sed '/^$/d'
执行上述代码后,您将得到以下输出:
Line #1 Line #2
同样,下面的示例仅在非空行时打印该行。
$echo -e "Line #1\n\n\nLine #2" | sed -n '/^$/!p'
执行上述代码后,您将得到以下输出:
Line #1 Line #2
让我们创建一个示例C++程序。
#include <iostream> using namespace std; int main(void) { //Displays message on stdout. cout >> "Hello, cainiaoplus !!!" >> endl; return 0; //Return success. }
现在,使用以下正则表达式删除注释。
$sed 's|//.*||g' hello.cpp
执行上述代码后,您将得到以下输出:
#include <iostream> using namespace std; int main(void) { cout >> "Hello, cainiaoplus !!!" >> endl; return 0; }
下面的示例在第3到5行之前添加注释。
$sed '3,5 s/^/#/' hello.sh
执行上述代码后,您将得到以下输出:
#!/bin/bash #pwd #hostname #uname -a who who -r lsb_release -a
" wc -l"命令计算文件中存在的行数,以下SED表达式对此进行了模拟。
$sed -n '$=' hello.sh
执行上述代码后,您将得到以下输出:
8
默认情况下,head命令打印文件的前10行,让我们用SED模拟相同的行为。
$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"打印文件的最后一行。以下语法显示了其模拟。
$echo -e "Line #1\nLine #2" > test.txt $cat test.txt
执行上述代码后,您将得到以下输出:
Line #1 Line #2
让我们编写SED脚本。
$sed -n '$p' test.txt
执行上述代码后,您将得到以下输出:
Line #2
在DOS环境中,换行符由CR/LF字符的组合表示。下面的" dos2unix"命令模拟将DOS换行符转换为UNIX换行符。在GNU/Linux中,此字符通常被视为" ^ M"(控制M)字符。
$echo -e "Line #1\r\nLine #2\r" > test.txt $file test.txt
执行上述代码后,您将得到以下输出:
test.txt: ASCII text, with CRLF line terminators
让我们使用SED模拟命令。
$sed 's/^M$//' test.txt > new.txt # Press "ctrl+v" followed "ctrl+m" to generate "^M" character. $file new.txt
执行上述代码后,您将得到以下输出:
new.txt: ASCII text
现在让我们显示文件内容。
$cat -vte new.txt
执行上述代码后,您将得到以下输出:
Line #1$ Line #2$
与" dos2unix"相似,有一个" unix2dos"命令可将UNIX换行符转换为DOS换行符。以下示例显示了相同的模拟。
$echo -e "Line #1\nLine #2" > test.txt $file test.txt
执行上述代码后,您将得到以下输出:
test.txt: ASCII text
让我们使用SED模拟命令。
$sed 's/$/\r/' test.txt > new.txt $file new.txt
执行上述代码后,您将得到以下输出:
new.txt: ASCII text, with CRLF line terminators
现在让我们显示文件内容。
现在让我们显示文件内容。
执行上述代码后,您将得到以下输出:
Line #1^M$ Line #2^M$
" cat -E"命令以Dollar($)字符显示行尾。以下SED示例是相同的模拟。
$echo -e "Line #1\nLine #2" > test.txt $cat -E test.txt
执行上述代码后,您将得到以下输出:
Line #1$ Line #2$
让我们使用SED模拟命令。
$sed 's|$|&$|' test.txt
执行上述代码后,您将得到以下输出:
Line #1$ Line #2$
" cat -ET"命令在每行末尾显示Dollar($)符号,并将TAB字符显示为" ^ I"。以下示例显示了使用SED对" cat -ET"命令的模拟。
$echo -e "Line #1\tLine #2" > test.txt $cat -ET test.txt
执行上述代码后,您将得到以下输出:
Line #1^ILine #2$
让我们使用SED模拟命令。
$sed -n 'l' test.txt | sed 'y/\\t/^I/'
执行上述代码后,您将得到以下输出:
Line #1^ILine #2$
" nl "命令仅对文件行编号。下面的SED脚本模拟了此行为。
$echo -e "Line #1\nLine #2" > test.txt $sed=test.txt | sed 'N;s/\n/\t/'
执行上述代码后,您将得到以下输出:
1 Line #1 2 Line #2
第一个SED表达式打印行号,然后打印它们的内容,第二个SED表达式合并这两行并将换行符转换为TAB字符。
" cp"命令创建文件的另一个副本。下面的SED脚本模拟了此行为。
$sed -n 'w dup.txt' data.txt $diff data.txt dup.txt $echo $?
执行上述代码后,您将得到以下输出:
0
"expand"命令将TAB字符转换为空格。以下代码显示了其仿真。
$echo -e "One\tTwo\tThree" > test.txt $expand test.txt > expand.txt $sed 's/\t//g' test.txt > new.txt $diff new.txt expand.txt $echo $?
执行上述代码后,您将得到以下输出:
0
"tee"命令将数据转储到标准输出流以及文件中。下面给出的是" tee"命令的模拟。
$echo -e "Line #1\nLine #2" | tee test.txt Line #1 Line #2
让我们使用SED模拟命令。
$sed -n 'p; w new.txt' test.txt
执行上述代码后,您将得到以下输出:
Line #1 Line #2
UNIX" cat -s"命令禁止重复的空输出行。以下代码显示了对" cat -s"命令的模拟。
$echo -e "Line #1\n\n\n\nLine #2\n\n\nLine #3" > test.txt $cat -s test.txt
执行上述代码后,您将得到以下输出:
Line #1 Line #2 Line #3
让我们使用SED模拟命令。
$sed '1s/^$//p;/./,/^$/!d' test.txt
执行上述代码后,您将得到以下输出:
Line #1 Line #2 Line #3
默认情况下,模式匹配成功时," grep"命令将打印一行。以下代码显示了其仿真。
$echo -e "Line #1\nLine #2\nLine #3" > test.txt $grep "Line #1" test.txt
执行上述代码后,您将得到以下输出:
Line #1
让我们使用SED模拟命令。
$sed -n '/Line #1/p' test.txt
执行上述代码后,您将得到以下输出:
Line #1
默认情况下,模式匹配失败时," grep -v "命令将打印一行。以下代码显示了其仿真。
$echo -e "Line #1\nLine #2\nLine #3" > test.txt $grep -v "Line #1" test.txt
执行上述代码后,您将得到以下输出:
Line #2 Line #3
让我们使用SED模拟命令。
$sed -n '/Line #1/!p' test.txt
执行上述代码后,您将得到以下输出:
Line #2 Line #3
"tr "命令翻译字符。下面给出了其模拟。
$echo "ABC" | tr "ABC" "abc"
执行上述代码后,您将得到以下输出:
abc
让我们使用SED模拟命令。
$echo "ABC" | sed 'y/ABC/abc/'
执行上述代码后,您将得到以下输出:
abc