[英]Shell scripting. Command substitution issue in my script
在我的Cygwin和我的Linux盒子(Debian)上,我遇到了同樣的問題:
我正在使用某種格式化ID的shell腳本,我想在斜杠出現(/)之前添加反斜杠()。
我的sed腳本在我的終端上運行良好:
# export someid="314-12345/08"
# echo "${someid}" | sed 's/\//\\\//'
輸出:
314-12345\/08
但是,如果我運行命令替換不是很好:
# someidformatted=`echo "${someid}" | sed 's/\//\\\//'`
sed: -e expression #1, char 9: unknown option to `s'
我在這里缺少什么?
先感謝您。
沒有義務使用/作為sed的分隔符。
s/a/c/
可能會變成
s#a#c#
所以在你的情況下:
someidformatted=`echo "${someid}" | sed 's#\/#\\\/#'`
會做的。
我只能猜測問題是由於某些缺乏/逃避造成的。
這是正在發生的事情。 從bash(1)手冊頁,強調我的:
當使用舊式反引號形式的替換時,反斜杠保留其字面含義, 除非后跟$,'或\\。 第一個不帶反斜杠的反引號會終止命令替換。 使用$(命令)表單時,括號之間的所有字符組成命令; 沒有人特別對待。
因此,與普通命令相比,命令替換需要更多的反斜杠。 您可以通過設置set -x
來調試它:
# someidformatted=`echo "${someid}" | sed 's/\//\\\//'`
++ echo 314-12345/08
++ sed 's/\//\\//'
sed: 1: "s/\//\\//": bad flag in substitute command: '/'
+ someidformatted=
# someidformatted=$(echo "${someid}" | sed 's/\//\\\//')
++ echo 314-12345/08
++ sed 's/\//\\\//'
+ someidformatted='314-12345\/08'
因此,您可以看到\\\\
的出現變為\\
。 添加更多反斜杠有效,但我更喜歡$(command)
形式:
# someidformatted=$(echo "${someid}" | sed 's/\//\\\//')
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.