2016-03-08 80 views
-1

我需要制作一个sh脚本来请求输入,然后写入现有文件。如何使shell脚本在现有文件上写入输入

#!/bin/bash 
sed '15isometext' settings.xml > test/settings1.xml 

这是代码。

该脚本要求输入“15isometext”。 “15”是行数,“我”是插入和“sometext”我需要替换和保存到文件的文本。

有可能吗?

谢谢

+1

看来你完全失去了。首先,您需要以灵活的方式将'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' 。 –

回答

0

从注释继续。如果我理解你的问题,你想以15isometext作为输入,然后将行-15的目标文件更改为sometext在更改后保存生成的文件(或者以某种不完全清楚的方式替换),那么你必须在15isometext上做一些工作,然后才能拨打sed。具体来说,您需要将15isometext分解为15(因此您知道哪一行可以操作),i因此您知道您将以某种方式输入内容,最后是sometext,这样您就可以知道要在现有内容中插入或替换哪些文本文件。

你可以用各种方式处理,但我怀疑你也可以处理2isomemoretext2345istillmoretext。除了分离这些值之外,还需要进行一些有效性检查。您需要验证您从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 

在看这个,让我知道,如果这是你的原意。

+0

OMG你超!谢谢 – robello84

0
sed -i 's/old/new/g' file.txt 

这就是你所需要的。记-i选项写回文件

你可以工作,其余的自己