我需要制作一个sh脚本来请求输入,然后写入现有文件。如何使shell脚本在现有文件上写入输入
#!/bin/bash
sed '15isometext' settings.xml > test/settings1.xml
这是代码。
该脚本要求输入“15isometext”。 “15”是行数,“我”是插入和“sometext”我需要替换和保存到文件的文本。
有可能吗?
谢谢
我需要制作一个sh脚本来请求输入,然后写入现有文件。如何使shell脚本在现有文件上写入输入
#!/bin/bash
sed '15isometext' settings.xml > test/settings1.xml
这是代码。
该脚本要求输入“15isometext”。 “15”是行数,“我”是插入和“sometext”我需要替换和保存到文件的文本。
有可能吗?
谢谢
从注释继续。如果我理解你的问题,你想以15isometext
作为输入,然后将行-15的目标文件更改为sometext
在更改后保存生成的文件(或者以某种不完全清楚的方式替换),那么你必须在15isometext
上做一些工作,然后才能拨打sed
。具体来说,您需要将15isometext
分解为15
(因此您知道哪一行可以操作),i
因此您知道您将以某种方式输入内容,最后是sometext
,这样您就可以知道要在现有内容中插入或替换哪些文本文件。
你可以用各种方式处理,但我怀疑你也可以处理2isomemoretext
和2345istillmoretext
。除了分离这些值之外,还需要进行一些有效性检查。您需要验证您从15isometext
获得的号码是有效的整数。您需要检查您尝试更改的文件(1)是否存在;和(2)它至少有所需的行数(在你的情况下是15)。
把一切放在一起,你可以这样做:
#!/bin/bash -- norc
[ -z $1 -o -z $2 ] && { ## validate 2 arguments given
printf "error: insufficient input, usage: %s string file\n" "${0//*\/}"
exit 1
}
declare -i num=0
num=$(grep -o "^[0-9]*" <<< "$1")
[ "$num" -eq "$num" >/dev/null 2>&1 ] || { ## validate num is integer
printf "error: no integer found in '%s'\n" "$1"
exit 1
}
[ ! -f "$2" -o "$(wc -l < "$2")" -lt "$num" ] && { ## validate file length
printf "error: file has less than '%s' lines.\n" "$num"
}
tmp="${1#*${num}}"
flag="${tmp:0:1}"
text="${tmp:1}"
if ! sed -i "${num}s/^.*$/$text/" "$2" ## adjust to ins/replace as needed
then
printf "error: substitution for line '%s' - failed.\n" "$num"
fi
作为一个测试,你可以创建一个文件说,20个空行:
$ printf "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n" > blankfile.txt
然后调用脚本上blankfile.txt
,例如:
$ bash replacelinetext.sh 15isometext blankfile.txt
最后确认它确实插入了sometext
在行15
$ nl -b a blankfile.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 sometext
16
17
18
19
20
在看这个,让我知道,如果这是你的原意。
OMG你超!谢谢 – robello84
sed -i 's/old/new/g' file.txt
这就是你所需要的。记-i选项写回文件
你可以工作,其余的自己
看来你完全失去了。首先,您需要以灵活的方式将'15isometext'解析为'15','i'和'sometext',这可能会处理任何行号,标记为'i',其余为'text'。将输入作为第一个参数传递给脚本,你可以做'num = $(grep -o“^ [0-9] *”<<<“$ 1”)'',对于标志'i',你可以做'tmp =“$ {1#* $ {num}}”; flag = $ {tmp:0:1}',最后是'text = $ {tmp:1}',然后在输入分离的情况下,可以在'num'行操作'flag' 。 –