1. 程式人生 > >解決sed替換“路徑”字串的問題

解決sed替換“路徑”字串的問題

問題描述

先來看出問題的指令碼:

target=/dev/nvme1n1 # 實際為動態獲得
sed -i "s/^filename=.*/filename=$target/" ./ebs_*.fio

指令碼中用某種方法動態地獲得了一個塊裝置,它是一個帶有/的路徑。接下來指令碼需要將這個“塊裝置”配置到./ebs_*.fio這些配置檔案中。

執行指令碼時報錯sed: -e expression #1, char 26: unknown option to 's',使用bash -x除錯指令碼發現sed命令所在行被解析為:

+ sed -i 's/^filename=.*/filename=/dev/nvme1n1/' ./ebs_ssd_randread.fio ./ebs_ssd_randwrite.fio

問題分析

我們知道sed可以用來替換文字檔案中的指定字串,它的一般語法如下:

sed 's/oldstring/newstring/' file

如果需要newstring中包含特殊字元需要用\進行轉義。那麼指令碼中的sed語句應該寫為:

sed -i 's/^filename=.*/filename=\/dev\/nvme1n1/' ./ebs_*.fio

但是,指令碼用到的塊裝置是動態獲取的,因此只能用變數去做替換:

sed -i "s/^filename=.*/filename=$target/" ./ebs_*.fio

我們不便對$target變數的內容(/dev/nvme1n1)進行轉義,因此變數中的/

就會與sed語句的語法衝突,從而產生錯誤。

解決辦法

通過學習sed命令,我發現它有一個很好的設計,就是命令的語法非常靈活。當你不方便轉義字串中/的時候,sed命令支援自定義語法的分隔符,讓你可以避開這個問題。

使用者自定義語法的分隔符很簡單,就是在s的後面緊跟自定義的分隔符即可,比如?等等……

$ cat file
aaaaaa
bbbbbb
cccccc
$ sed 's/bb/ee/' file
aaaaaa
eebbbb
cccccc
$ sed 's%bb%ee%' file
aaaaaa
eebbbb
cccccc
$ sed 's$bb$ee$' file
aaaaaa
eebbbb
cccccc
$ sed '
[email protected]
@[email protected]'
file aaaaaa eebbbb cccccc $ sed 's?bb?ee?' file aaaaaa eebbbb cccccc $ sed 's?bb?ee?g' file aaaaaa eeeeee cccccc

因此,只要稍微變通一下,把指令碼改為下面的樣子,就可以順利執行:

target=/dev/nvme1n1 # 實際為動態獲得
sed -i "s?^filename=.*?filename=$target?" ./ebs_*.fio

另一種方法

上面的方法自然是最直接且簡便的,還有一種比較容易想到的,可以算是一種“曲線救國”的方法:

target=/dev/nvme1n1 # 實際為動態獲得
target_sed=$(echo $target |sed -e 's/\//\\\//g')
sed -i "s/^filename=.*/filename=${target_sed}/" ./ebs_*.fio

不再過多解釋。

參考文獻

相關推薦

解決sed替換路徑字串的問題

問題描述 先來看出問題的指令碼: target=/dev/nvme1n1 # 實際為動態獲得 sed -i "s/^filename=.*/filename=$target/" ./ebs_*.fio 指令碼中用某種方法動態地獲得了一個塊裝置,它是一個

Shell指令碼執行hive語句 | hive以日期建立分割槽表 | linux schedule程式 | sed替換檔案字串 | shell判斷hdfs檔案目錄是否存在

#!/bin/bash source /etc/profile; ################################################## # Author: ouyangyewei # #

sed替換含反斜(\)的字串

今天在linux替換配置檔案時,test檔案裡有一個字串 e:\ 需要換成/usr/home/ 用了sed命令:sed -i "s?e:\\?/usr/home/?g" test 但是總是報sed: -e expression #1, char 34: unterminated `s' command

sed 替換文字內得路徑字元等等

1. 句子 sed -i 's%/opt/apache-maven-3.5.3/conf/settings.xml%/data/opt/apache-maven-3.5.3/conf/settings.xml%g' ./*/config.xml 2. 解釋 sed linux 一個檔案流式處理的工具 2.1

vim 編輯器和 sed 命令的字串替換

一、vim編輯器字串替換 1、開啟需要編輯的檔案 2、執行如下命令 #oldstring 為需要被替換的字串 #newstring 用來替換的新字串 #替換是替換全部oldstring為newstring %s/oldstring/newstring/g 二、sed

Linux Shell用sed替換匹配的斜槓、大括號等字串的方法

1.去掉字串中的\(斜槓在shell中和java一樣,有轉義含義,所以可以用#作為運算子避免混淆) str='\"saasdadas\"' str=str | sed #\##g' 2.去掉字串中的\

sed替換字串的貪婪匹配和最小匹配

最近在shell對文字進行操作,遇到了使用sed進行最小匹配的問題。sed預設匹配規則是貪婪匹配。 舉例來說,如果文字內容為: (aa)bb(cc) 使用sed匹配: '/(.*)/' 匹配結果為: (aa)bb(cc) 上述結果即貪婪匹配。 最小匹配的結果是

UVA1658 Admiral 拆點法解決結點容量(路徑不能有公共點,容量為1的時候) 最小費用最大流

ear ace == void for include () size max /** 題目:UVA1658 Admiral 鏈接:https://vjudge.net/problem/UVA-1658 題意:lrj入門經典P375 求從s到t的兩條不相交(除了s和t

Python-Day4實現簡單的shell sed替換功能

color utf-8 ast style 實現 nes 寫入 readlines lov code: 1 f = open(‘yesterday‘,‘r‘,encoding=‘utf-8‘) 2 f2 = open(‘yesterday.bak‘,‘w‘,encod

解決Java工程路徑中含有中文的情況

轉換 coder 我們 urldecode tar ica 路徑 package enc 問題: 當Java工程路徑中含有中文時,得不到正確的路徑 *** 解決: 這其實是編碼轉換的問題。當我們使用ClassLoader的getResource方法獲取路徑時,獲取到的路徑被

android解決AVD中文路徑無法啟動問題

notepad 啟動 tail 設備配置 找到 重新 lan 管理員 路徑更改 在as中新建一個AVD,然而啟動時卻報錯,總之是不能找到中文路徑 然後這個虛擬設備被默認安裝在了C盤我的用戶李敏啊,而我用戶名是中文名導致無法識別 解決辦法,使用鏈接文件格式修改虛擬設備配置路徑

2018.4.26 六周第二次課 (正則sed 替換

sedsed工具介紹(替換、及替換指定的字符) sed介紹:sed工具主要是替換的文本輸出到屏幕上,而且還有其他更豐富的功能。sed命令格式:sed -n ‘n‘ p filename,單引號內的n是一個數字,表示幾行。-n選項的作用就是只顯示我們要打印的行,無關緊要的內容不顯示。 創建一個sed目錄,把

自定義replace函數,模仿shell的sed替換

In sed替換 argv new gin replace imp string ring import sys"""Usages: 1. command line: python replacestr.py para1 para2 para3; 2.

sed替換文件後出現文件裏多了一個 ^M

vpd watermark log vim 文件 fff ESS -i dos 替換命令sed -i (用/c 進行整行替換): 解決方法:yum -y install dos2unixdos2unix db.conf然後vim進去發現沒有 ^M了sed替換文件後出現文件

sed替換與別名配置

路徑 out 修改 臨時 cfg 永久 specific uname 文件包含 第1章 Sed替換與別名設置1.1 cp復制與覆蓋已知/tmp下已經存在test.txt文件,如何執行命令才能把/mnt/test.txt拷貝到/tmp下覆蓋掉/tmp/test.txt,而讓系

centos 7 使用sed命令去除字串中的空格(可用於去除檔名的空格)

1.刪除字串行首空格(刪除檔名首部空格)      sed 's/^[ \t]*//g' 2. 刪除字串行尾空格(刪除檔名尾部空格)     sed 's/[ \t]*$//g' 3.去除字串中所有空格(去除字串中所有空格)

invalid bound statement (not found)解決辦法 (掃描路徑是正確的)

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.

C++中路徑字串的切割方法

在開發中,我們經常需要得到當前模組的上級目錄,甚至上上級目錄等,下面提供一個例項演示當前模快路徑的獲取、通過路徑字串的切割獲取上三級目錄。 【詳細程式碼】 #include <iostream> #include <atlstr.h> #include <s

sed 替換命令(2)

輸入檔案不會被修改,sed 只在模式空間中執行替換命令,然後輸出模式空間的 內容。 文字檔案 employee.txt 101,John Doe,CEO 102,Jason Smith,IT Manager 103,Raj Reddy,Sysadmin 104,Anand Ram,Dev

解決python中因為字串編碼導致的錯誤

python程式設計例項: 1. 將抓取的網站資料,儲存到excel表格中,在sheet.write()函式時,報錯如下: UnicodeDecodeError: 'ascii' codec can't decode byte 0xe6 in position 0: ordinal not