2016-08-23 118 views
1

我已閱讀s///命令的手冊sed。在那裏,它表示:在GNU sed中,s ///命令的「e」修飾符是什麼意思?

e

該命令允許一個管道輸入從shell命令到圖案 空間。如果進行替換,將執行在 模式空間中找到的命令,並將模式空間替換爲其輸出。 尾隨換行符被抑制;如果要執行的命令 包含一個空字符,則結果未定義。這是一個GNU sed擴展。

我不知道什麼是有用的:

echo "1234" | sed 's/1/echo ss/e' 
echo "1234" | sed 's/1/ss/' 

這兩個命令導致相同的,那麼什麼是e修改呢?

+1

我建議用'/ touch'替換'/ echo'並看看'ls -ltr'。 – Cyrus

回答

2
$ printf "%s\n" 1234 2345 3456 | 
> sed -e 's/\(..\)\(..\)/echo $((\1 * \2))/e' 
408 
1035 
1904 
$ 

printf命令呼應3 4-三行數字。 sed腳本將每行分成一對2位數字,創建一個命令echo $((12 * 34)),例如運行它,輸出(對於給定值爲408)包含在(作爲)模式空間中 - 然後將其打印出來。所以,對於這個腳本,兩位數的數字相乘並顯示結果。

,如果你願意,你可以更大膽的嘗試:

$ printf "%s\n" 1234 2345 3456 | 
> sed -e 's/\(..\)\(..\)/echo \1 \\* \2 = $((\1 * \2))/e' 
12 * 34 = 408 
23 * 45 = 1035 
34 * 56 = 1904 
$ 

注雙反斜線 - 這是相當重要的。你能避免爲使用雙引號的需要:

printf "%s\n" 1234 2345 3456 | 
sed -e 's/\(..\)\(..\)/echo "\1 * \2 = $((\1 * \2))"/e' 

當心:符號會在每次s///命令實際上換人時間運行的外部命令。如果您的文件中有數百萬行數據,則可能意味着執行了數百萬條命令。

2

/e選項是一個GNU sed擴展名。它會將替換的結果作爲命令傳遞給shell進行評估。注意:

vnix$ sed 's/a/pwd/' <<<a 
pwd 

vnix$ sed 's/a/pwd/e' <<<a 
/home/tripleee 

你的榜樣引起相同的行爲(回顯完全替代文本),所以它是一個選擇不當的例子。

開箱即用,模式空間引用當前輸入行,但有一些方法可將其他內容放入模式空間。替換修改了模式空間,但還有其他一些sed命令以其他方式修改模式空間。 (對於一個簡單的例子,x交換與保持空間模式空間,這基本上是另一種內置的變量,你可以使用任何你想要的。)