2016-08-15 143 views
1

下面是我的腳本,它將接受文件輸入或標準輸入...但我不能逃避權利! - 我已經試過單引號和雙引號等..Bash腳本和引用SED

while read line 
do 
sed 's/path\/12345/path\/12345 == useful name/g' 
sed 's/path\/6789/path\/6789 == useful name - 2/g' 
done < ${1:-/dev/stdin} 
+2

請注意,在名稱中使用空格來生成文件名(路徑)會強調腳本 - 在操作文件和目錄時需要小心。可以辦到;你只需要小心(雙引號是你的朋友)。 –

+0

謝謝我只是試圖更新文本,即在myfile.txt我有一個路徑,說'路徑/ 12345',我想用路徑/ 12345 ==有用的名稱替換它 – Tony

+0

當您使用'sed'要操縱路徑,改變分隔符幾乎總是一個好主意。 'sed's @ path/12345 @ path/12345 ==有用的名字@ g'' –

回答

3

從標準輸入讀取的sed命令一樣的while read循環。這導致混亂。

你可能只想要這個(周圍沒有while read; do …; done環 - 看到chat):

sed -e 's/path\/12345/path\/12345 == useful name/g' \ 
    -e 's/path\/6789/path\/6789 == useful name - 2/g' \ 
    "[email protected]" 

裏面的腳本,這將在命令行或標準上規定的所有文件運行sed腳本如果沒有指定文件,則輸入。這就是"[email protected]"在這方面的含義。

$ cat > script.sh 
sed -e 's/path\/12345/path\/12345 == useful name/g' \ 
    -e 's/path\/6789/path\/6789 == useful name - 2/g' \ 
    "[email protected]" 
$ bash script.sh 
path/12345 
path/12345 == useful name 
path/23456 
path/23456 
path/6789 
path/6789 == useful name - 2 
android-path/67890-twirling 
android-path/6789 == useful name - 20-twirling 
$ 

我輸入4行:

path/12345 
path/23456 
path/6789 
android-path/67890-twirling 

其它行是從腳本的輸出。當我把四個輸入線到一個文件data,我得到的輸出:

$ bash script.sh data 
path/12345 == useful name 
path/23456 
path/6789 == useful name - 2 
android-path/6789 == useful name - 20-twirling 
$ 

這看起來像什麼腳本應該做的事。我們可以辯論最後一行是否應該被映射,但腳本中使用的表達式會執行顯示的映射。

+0

我必須錯過一些東西 - 它不起作用。該腳本不輸出任何東西 - 我運行腳本,它等待一些stdinput - 我放在路徑\ 12345命中輸入並得到什麼,只是另一行 - – Tony

+1

'路徑\ 12345'將不匹配的路徑/ 12345 '模式,會嗎?錯字在哪裏? –

+0

對不起,是一個錯字(它在劇本中的權利)。 – Tony