2017-05-23 26 views
0

我一直在使用sed作爲文本處理和清理的一部分。其中一個文本更改要求我用數字(不包含空格)替換方括號中的數字。這裏是一個例子:在配置變量時,sed的放置模式停止工作

a[1]會變成a1。因爲這個限制,我不得不求助於替換模式,如果有另外一個sed(或其他)表達式可以做同樣的事情工作沒有替換模式,那麼我會很高興看到它,但我仍然主要對我的bug的性質很好奇)。

這是我用過的命令:

sed 's/\[\([^] ]*\)\]/\1/g' file.txt

file.txt的地方可能包含:

[ [ a[1](t) + b[1](t) ] + [ a[2](t) * b[2](t) ] ]

命令會產生

[ [ a1(t) + b1(t) ] + [ a2(t) * b2(t) ] ]

現在我嘗試通過將其放入腳本來自動執行此操作。由於我需要以許多其他方式處理文本,因此我創建了一個臨時變量來保存方括號的更改。這裏是 '的' 腳本:

#!/bin/bash 
#$1 is file name. 
square_change=$(sed 's/\[\([^] ]*\)\]/\1/g' "$1") 
echo $square_change 

./script.sh file.txt輸出:

[ [ a1(t) + b1(t) ] + [ a2(t) file2.txt file.txt script.sh b2(t) ] ] 其中file2.txt file.txt script.sh是我的腳本目錄中的文件。

我希望它輸出什麼sed 's/\[\([^] ]*\)\]/\1/g' file.txt原來做。我花了一些時間嘗試不同的事情,但似乎沒有任何工作。任何想法,我去哪裏錯了?

乾杯,

回答

2

一個在Unix外殼腳本最討厭的(但靈活)的東西被引用。腳本的正確版本如下:

#!/bin/bash 
#$1 is file name. 
square_change="$(sed 's/\[\([^] ]*\)\]/\1/g' "$1")" 
echo "$square_change" 

在你的情況,echo $square_change全文echo ... * ...,所以*得到由在當前目錄中的文件列表取代。 ($()附近的報價不是絕對必要的,但有助於必要的「報價習慣」。)

0

既然要[...]之間的替代號碼,那麼你可以使用:

s='[ [ a[1](t) + b[1](t) ] + [ a[2](t) * b[2](t) ] ]' 
sed -E 's/\[([0-9]+)\]/\1/g' <<< "$s" 

[ [ a1(t) + b1(t) ] + [ a2(t) * b2(t) ] ] 
相關問題