我正在尝试从文件中删除特定行,然后将编辑后的行附加到文件中。我得到了最后一部分,但我删除旧行的sed命令无效。
sed '/^$userinput/d' file1.txt > file2.txt
这最终会将所有文件内容添加到新文件中。而不仅仅是我想要保留的线条。用户输入是我要删除的行,由用户提供。这是我正在上课的BASH项目。我想删除它,从文件中删除该行。
sed "/^${1}$/d" file > otherfile
这会添加所有想要和不需要的行
sed "/^$1/d" file > otherfile
创建空文件
这是我正在努力的声明。最后将其粘贴。
update(){
read -p "Enter the course number of the course you would like to update: " updateInput
grep $updateInput my_course.txt>update.txt
typeset -i status
typeset grade
if [ $? -eq 0 ]
then
read -p "Status: " status
while(true)
do
if [ $status -eq 0 ]
then
break
elif [ $status -eq 1 ]
then
break
else
printf "Enter either a 0 or 1\n"
fi
done
read -p "Grade: " grade
while(true)
do
if [ $status -eq 0 ]
then
break
elif [ $status -eq 1 ]
then
break
else
printf "Enter either a 0 or 1\n"
fi
done
read -p "Grade: " grade
while(true)
do
case $grade in
A)
break
;;
B)
break
;;
C)
break
;;
*)
read -p "Enter either an A, B, C: " grade
;;
esac
done
sed "/^$updateinput/d" my_course.txt>my_course1.txt
awk -F, '
/^CSC/{printf$1","$2","$3"," > "update1.txt"}' update.txt
printf $status","$grade >> update1.txt
cat my_course1.txt > my_course.txt
cat update1.txt >> my_course.txt
rm update.txt
rm update1.txt
fi
}
我很抱歉没有尽快发布。曾经有一段时间我试着粘贴它,告诉我有错误。
在文件中放置两行文字并调用上面的脚本,其状态为1且成绩为A,这是te输出
CSC3320,SYSTEM-LEVEL PROGRAMMING,3,1,A
这实际上是改变文件的脚本。在函数开头添加了一个grep。
grep $updateInput my_course.txt>update.txt (This is at the beginning of the function. Everything else was at the bottom. )
sed "/^$updateinput/d" my_course.txt>my_course1.txt
awk -F, '
/^CSC/{printf$1","$2","$3"," > "update1.txt"}' update.txt
printf $status","$grade >> update1.txt
cat my_course1.txt > my_course.txt
cat update1.txt >> my_course.txt
rm update.txt
rm update1.txt
答案 0 :(得分:1)
在这种情况下,您需要这样做,因为$
表示行尾正则表达式。
尝试:
sed "/^${userinput}/d" file1.txt >> file2.txt
>>
也将附加到文件中。
答案 1 :(得分:0)
$
是sed中的特殊字符,意思是“行尾”。如果您想在行的乞讨时匹配文字$userinput
,请使用see '/^\$userinput/d'
如果您希望shell用变量$userinput
替换其内容,请使用双引号而不是单引号:
sed "/^$userinput/d" file1.txt > file2.txt
或更好
sed "/^${userinput}/d" file1.txt > file2.txt
这将删除以${userinput}
的值开头的行,如果您只想删除恰好为${userinput}
的值的行,请使用
sed "/^${userinput}$/d" file1.txt > file2.txt
适合我:
╰─ ☭ cat file
bar
foobar
foo
asdf
qwer
foo
asdf
╰─ ☭ cat script.sh
#!/bin/bash
sed "/^${1}$/d" file > otherfile
╰─ ☭ ./script.sh foo
╰─ ☭ cat otherfile
bar
foobar
asdf
qwer
asdf
答案 2 :(得分:0)
我确实尝试过,发现变量值没有被sed语句中的shell正确替换。 所以sed命令而不是搜索值,因为模式正在使用变量名称作为模式进行搜索
即它试图将$ userinput搜索为模式@ EOL
这是由于单引号的存在,再次尝试你的命令,但用双引号替换它们:它在我的系统中工作。
code ::
Nitin@Kaizen ~> cat new
#!/bin/bash
echo "the input file :"
cat INPUT2.txt ;
echo "enter line to remove" ;
read rem ;
date >> sed.log ;
sed "/$rem/d" INPUT2.txt >> sed.log;
echo "the output file :" ;
cat sed.log;
run ::
Nitin@Kaizen ~ > ./new
the input file :
aa1
chap1
mk.t
temp.txt
z1
z2
enter line to remove
temp.txt
the output file :
Thu Mar 28 08:18:07 IST 2013
aa1
chap1
mk.t
z1
z2
答案 3 :(得分:0)
弄清楚如何修复它。
update(){
read -p "Enter the course number of the course you would like to update: " updateInput
grep -v ^$updateInput my_course.txt>updatedfile.txt
grep ^$updateInput my_course.txt>editedline.txt
if [ $? -eq 0 ]
then
while(true)
do
read -p "Status: " status
if [ $status -eq 0 ]
then
break
elif [ $status -eq 1 ]
then
break
else
printf "Enter either a 0 or 1\n"
fi
done
read -p "Grade: " grade
while(true)
do
case $grade in
A)
break
B)
break
;;
C)
break
;;
*)
read -p "Enter either an A, B, C: " grade
;;
esac
done
awk -F, '
/^CSC/{printf$1","$2","$3"," >> "updatedfile.txt"}' editedline.txt
printf $status","$grade"\n" >> updatedfile.txt
cat updatedfile.txt > my_course.txt
rm updatedfile.txt
rm editedline.txt
else
printf "This course doesn't exist in your courses list.\n"
fi
}
在代码的开头我使用
grep -v regexexperssion file1>file2
获取文件中的所有行而不删除该行。然后我使用grep从文件中获取要编辑的实际行。
grep regexexperssion file1>file3
在awk的底部我使用file3中的行上的用户生成的变量执行编辑,然后我将它附加到file1,后者是用
生成的grep -v regexexpression file1>file2
命令
注意上面的解释与上面使用的实际代码不符,但是我认为对于查看这封信的人来说更好一些解释会更好。另外我知道可能有更好的方法来解决这个问题,上面的代码可能会缩短。关于如何改进这一点的任何意见将不胜感激。感谢所有帮助过我的人。