2

ファイルから特定の行を削除し、編集した行をファイルに追加しようとしています。最後の部分は正しいのですが、古い行を削除する 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  
    }  

すぐに投稿できなかったことをお詫びします。貼り付けようとするたびに、エラーがあると言われました。

ファイルに 2 行のテキストを配置し、ステータスが 1 でグレードが A の上記のスクリプトを呼び出した後、これが出力されました。

CSC3320、システムレベルのプログラミング、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

4 に答える 4

1

この場合$、行末の正規表現を意味するため、これを行う必要があります。

試す:

sed "/^${userinput}/d" file1.txt >> file2.txt

また>>、ファイルに追加します。

于 2013-03-28T02:19:31.047 に答える
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   

指図

上記の説明は、上記で使用されている実際のコードとは一致しないことに注意してください。これは、この手紙を読んでいる人にとって、より一般的な説明が得られると考えたからです。また、この問題を解決するためのより良い方法があり、上記のコードを短縮できる可能性があることも知っています。これを改善する方法についてのご意見をいただければ幸いです。私を助けてくれたすべての人に感謝します。

于 2013-03-28T17:24:59.423 に答える
0

私はそれを試してみましたが、変数値がsedステートメントのシェルによって適切に置き換えられていないことがわかりました。そのため、パターンとして値を検索する代わりに sed コマンドは、変数名をパターンとして検索を行っていました

つまり、$userinput をパターン @ EOL として検索しようとしていました。

これは一重引用符の存在が原因でした。コマンドをもう一度試してください。ただし、それらを二重引用符に置き換えてください。私のシステムでは機能しました。

コード ::

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;

走る ::

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
于 2013-03-28T02:55:40.637 に答える
0

$「行末」を意味する sed の特殊文字です。行頭でリテラルを一致させたい場合は、次$userinputを使用しますsee '/^\$userinput/d'

シェルで変数をその内容に置き換えたい場合は$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
于 2013-03-28T02:32:12.340 に答える