为什么不会从文件中删除行?

时间:2013-03-28 02:16:17

标签: bash sed

我正在尝试从文件中删除特定行,然后将编辑后的行附加到文件中。我得到了最后一部分,但我删除旧行的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  

4 个答案:

答案 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   

命令

注意上面的解释与上面使用的实际代码不符,但是我认为对于查看这封信的人来说更好一些解释会更好。另外我知道可能有更好的方法来解决这个问题,上面的代码可能会缩短。关于如何改进这一点的任何意见将不胜感激。感谢所有帮助过我的人。