使用sed更改包含路径

时间:2016-02-24 13:37:19

标签: bash sed

我对bash有一个很好的了解,但是我经常搜索它并总是找到我想做的事情...除了这次......

我的目标是在循环中创建一个“sed”,以便我的脚本输入文件并将其他行替换为其他行。

例如

1 blabla
2 blabla
3 linetoreplace1
4 blabla
5 blabla
6 linetoreplace2

我必须用别的东西替换第3和第6行

要替换的每一行的数量存储在变量中:

cat lines
1
14
16
150
159

和替换文本(链接)存储在另一个变量中:

cat pathlines
./home/newlink_toplace1
./home/newlink_toplace2
./home/newlink_toplace3
./home/newlink_toplace4
./home/newlink_toplace5

所以最后我的脚本“myscript.sh”作用于“file.txt”看起来像这样:

#!/bin/bash

#the variables containing the number of the lines and the replacing text are already defined in the current directory

#lines.txt
#text.txt

for i in $(seq 1 15)
do

# i put the replacing texte from the list to a variable "reptext"

sed "${i}q;d" text.txt > reptext

#i put the line where we should do the replacement in "line"

sed "${i}q;d" lines.txt > line

# ...and finally the command to do the job  

sed -i "${line} s/^\text_to_replace/\'"$reptext"'/" file.txt

done

我收到了多条错误消息,包括:

 > sed -i -e "${i} s /^\voila/\'"$reptext"'/" file.txt 
sed: -e expression #1, char 44: unterminated `s' command

> sed -i "${i}s/.*/'"$reptext"'/" file.txt 
sed: -e expression #1, char 13: unknown option to `s'

 > sed -i '${i}s/^\''/\'"$reptext"'/' file.txt 
sed: -e expression #1, char 0: unmatched `{'

 > sed -i "${i}s /^\voila/\'"$reptext"'/" file.txt 
sed: -e expression #1, char 43: unterminated `s' command

有时候没有错误,但最后没有来自剧本的行动

> sed -i "${i}s/^\voila/\${reptext}/" file.txt

最后我尝试了不同的sytax,以不同的方式存储我的变量,并尝试了不同的方式在sed中表达我的变量而不是'“$ repext”':

`cat reptext`

echo "$reptext"

"'`("'$£**~##{{[|~|`reptext{~#[`|{[`\\^'"

rm privatepartofmycomputerandlethimsufferslowly

你能帮助我吗

提前多多感谢

2 个答案:

答案 0 :(得分:1)

使用GNU sed,paste和bash' Process Substitution

sed -f <(paste -d " " lines.txt pathlines.txt | sed 's/^\([0-9]\+\) \(.*\)/\1s|.*|\2|/') input.txt

使用lines.txt:

2
6
12
33
50

输出:

1 blabla
./home/newlink_toplace1
3 linetoreplace1
4 blabla
5 blabla
./home/newlink_toplace2

答案 1 :(得分:1)

我使用awk和其他东西

awk '
    NR == FNR {replacement[$1] = $2; next} 
    FNR in replacement {print replacement[FNR]; next} 
    {print}
' <(paste lines pathlines) filename.for.replacing

演示

$ awk '
>     NR == FNR {replacement[$1] = $2; next} 
>     FNR in replacement {print replacement[FNR]; next} 
>     {print}
> ' <(paste lines pathlines) <(seq 20)
./home/newlink_toplace1
2
3
4
5
6
7
8
9
10
11
12
13
./home/newlink_toplace2
15
./home/newlink_toplace3
17
18
19
20