我在一個檔案中有這個文本
random text 1.- random text 2. random text 3.- random 22 text 4. random text
我想在每個數字之前創建一個新行,后跟一個點。這是我的代碼:
for number in {1..4}
do
var=$(sed -n "s/.*\([^0-9]$number\.[^0-9]\).*/\1/p" file)
echo $var
sed -i "s/$var/\n$var/g" file
done
這是我得到的結果:
random text
1.- random text
2. random text
3.- random
2. text
4. random text
如果沒有點,我不明白為什么它會在數字 22 之前創建一個新行。預期的結果是這樣的:
random text
1.- random text
2. random text
3.- random 22 text
4. random text
有人可以幫我解釋一下我的錯誤在哪里嗎?非常感謝你
uj5u.com熱心網友回復:
當number=2你得到var=' 2.'
這被輸入到最后一個sed命令中/ 2./\n 2./g,因為第一個命令2.將文字2與任何其他單個字符 ( .) 匹配,這就是它最終匹配22. 然后讓你更加困惑,\n 2.說要插入文字,2.因此22被替換為2..
考慮:
$ echo '22' | sed 's/2./2./'
2.
當前代碼的一個快速修復是使用引數替換添加反斜杠來轉義.in $var:
for number in {1..4}
do
var=$(sed -n "s/.*\([^0-9]$number\.[^0-9]\).*/\1/p" file)
var="${var/./\\.}" # replace "." with "\."
echo $var
sed -i "s/$var/\n$var/g" file
done
$ cat file
random text
1.- random text
2. random text
3.- random 22 text
4. random text
前導空格是第[^0-9]一個sed命令中第一個的匹配,因為它在括號內,它被認為是捕獲組的一部分,因此被包含在\1參考中。嘗試將左括號向右移動一個字符,例如:
for number in {1..4}
do
# replace this:
#var=$(sed -n "s/.*\([^0-9]$number\.[^0-9]\).*/\1/p" file)
# with this:
var=$(sed -n "s/.*[^0-9]\($number\.[^0-9]\).*/\1/p" file)
var="${var/./\\.}"
echo $var
sed -i "s/[[:space:]]*$var/\n$var/g" file
done
注意:我之前已經[[:space:]]*在任何空白處添加了匹配$var;替換 ( \n$var) 將有效地從現在將成為$var 之前的行的末尾洗掉所述空格。
結果:
$ cat file
random text
1.- random text
2. random text
3.- random 22 text
4. random text
uj5u.com熱心網友回復:
我會使用一個sed命令來撰寫它:
sed 's/ \([0-9][0-9]*\.\)/\
\1/g' file
uj5u.com熱心網友回復:
使用sed 在單通
$ sed -i.bak 's/[0-9]*\.[^0-9]*/\n&/g' file
random text
1.- random text
2. random text
3.- random 22 text
4. random text
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/397131.html
