如何根据我在Unix Scripting中提供的输入编辑特定行

时间:2018-03-07 07:21:10

标签: shell unix

我在bash中编写了一个程序,其中将有一个文件中学生的详细信息以及将输入作为roll no传递给它我需要编辑该文件中的特定行。

但是当我尝试传递roll no时,它会在条件匹配时向我显示整个文件以进行编辑。

这是我的计划:

#!/bin/bash

input="/home/kalyan/Desktop/Exercise/studet.txt"
while IFS=":" read -r rollno name s1 s2 s3
do
echo "$rollno"
done < "$input"
read -p "Enter the Roll No:" rollno1
if [ "$rollno"-eq"$rollno1" ]; then
nano studet.txt
cat studet.txt
else
echo "Doesn't match"
fi

或此计划

#!/bin/bash

file="/home/kalyan/Desktop/Exercise/"

FILE="/home/kalyan/Desktop/Exercise/studet.txt"

echo "file to be processed $FILE" 
cat $FILE
echo "Reading Roll Number:"
read -r rollno;
if grep $rollno /home/kalyan/Desktop/Exercise/studet.txt
then
echo "Roll No exists"
else
echo "Roll No doesn't exists"
fi

我试图根据 roll no 作为输入来获取学生的记录。 当 roll no 匹配时,我显示他的rollno,名字,三个主题的标记(s1,s2,s3)。 现在我需要编辑符合条件的行。

2 个答案:

答案 0 :(得分:0)

我不确定我完全理解你在做什么,但我会这样做(基于问题的标题):

line_number=`grep -n "^$rollno\$" /tmp/a | cut -d : -f 1 "$input"`
nano +"$line_number" studet.txt

这最后一个文件是否与$input相同?

答案 1 :(得分:0)

我不确定这是否是您想要的...但是说您想要根据运行程序时作为输入的ID来更改用户名:

studet.txt

1:surname1:name1:age1
2:surname2:name2:age2
3:surname3:name3:age3

script.sh

#!/bin/bash
read -p "Enter the Roll No:" rollno
read -p "Enter new name:" name
awk  -F  ":" -v roll="$rollno" -v name="$name" 'BEGIN {OFS = ":"} $1==roll {$3=name}1' studet.txt > testfile.tmp && mv testfile.tmp studet.txt

以上脚本会要求用户传递rollno(exp 1)和name值。

然后awk commad将检查文件中第一个文件中是否存在给定的rollno(文件将使用:分隔符分割成字段),如果此rollno存在,则同一行的第三个字段将由用户之前传递的值name更改。

尝试传递1然后传递一些字符串,然后检查文件。