更改文本文件中的内容

时间:2014-03-18 10:12:12

标签: bash

我的文字文件包含以下内容:

param_1=7412
param_2=1234

我想要做的是将param_1值设置为param_2并将新值设置为param_1。所以看起来应该是这样的:

param_1=9999
param_2=7412

更改值后,我必须将内容保存回文件。

也许我可以使用" sed"命令实现这个?还有更多想法吗?

4 个答案:

答案 0 :(得分:2)

为了更灵活地使用您可以使用的参数值,可以使用source命令或.运算符

让我们假设该文件包含以下行

param_1=7412
param_2=1234

然后我们可以使用

导入此变量
#!/bin/bash

source <filename>
echo $param_1
echo $param_2

param_1=9999
param_2=7412

#check that new values are assigned to variables
echo $param_1
echo $param_2

然后使用echo命令将新值放入文本文件中。请注意,您应该先处理被删除的文件,或者您需要选择是否要添加或覆盖该文件:

destdir=/some/directory/path/filename

if [ -f "$destdir"]
then 
    echo "param_1=$param_1" >  "$destdir"
fi

if代表文件的$destdir次测试。

注意: >替换文件中的文本。 如果您只想将$param_1中的文字附加到文件现有内容中,请改用>>

echo "param_2=$param_2" >> "$destdir"

希望这有帮助。

参考文献:

https://askubuntu.com/questions/367136/how-do-i-read-a-variable-from-a-file

Shell - Write variable contents to a file

答案 1 :(得分:2)

如果您不知道以前的值,那么您可以像

这样的配置方式修改文件
 #!/bin/bash
sed -i "s/\(param_1 *= *\).*/\19999/" file
sed -i "s/\(param_2 *= *\).*/\17412/" file

答案 2 :(得分:1)

共:

您可以使用sed命令执行此操作:

sed -i 's|param_1=7412|param_1=9999|' file.txt
sed -i 's|param_2=1234|param_2=7412|' file.txt

更新

但是在更详细的回答中,我为你写了一个bash:

#!/bin/bash                                               

VAL_1=`echo $RANDOM | cut -c1-4`   #VAL_1=`shuf -i 0000-9999 -n 1`
VAL_2=`awk -F= '{print $2}' file.txt | head -1`

sed -i.bak "1s/.*/\param_1=${VAL_1}/g" file.txt
sed -i.bak "2s/.*/\param_2=${VAL_2}/g" file.txt

答案 3 :(得分:0)

我不太清楚实际的目标是什么。但我解释的目标是弹出最后一个条目并将所有其他条目移开。

就我个人而言,我认为有更好的工具可以进行这种处理(例如python),但我尝试用纯粹的bash来解决这个难题。

这是脚本的作用:

$ cat input.txt
param1=1000
param2=2000
param3=3000
param4=4000
$ ./script input.txt 10000
$ cat input.txt
param1=10000
param2=1000
param3=2000
param4=3000

这是脚本,请参阅注释以获取详细信息:

#!/usr/bin/env bash

# Take an input file as the first argument
data="$1"

# Take the new value as the second argument
new_value=$2

# Read each line of the input file into an array
# note that readarray is a bash 4 builtin command
readarray -t entries < "$data"

# Get the length of the array
len_entries=${#entries[@]}

# Remove the last entry of the array since we don't need it anymore
unset entries[len_entries-1]

# Set up a counter needed for indexing and creating the new string inside the loop
counter=2

# Process each entry of the array
for entry in "${entries[@]}"; do

    # Get the value of the param?=*
    entry="${entry#*=}"

    # Enumerate the new string
    entry="param${counter}=${entry}"

    # Write the new string to its new position inside the array
    entries[counter-1]="$entry"

    # Raise the counter
    (( counter++ ))
done

# Add the new user defined value to the first index of the array
entries[0]="param1=${new_value}"

# Write the contents of the array to the file
printf "%s\n" "${entries[@]}" > "$data"