我对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
你能帮助我吗
提前多多感谢
扬
答案 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