Toggle navigation
knowledge
作成
作成
下書き一覧
ストック
一覧
複合検索
サインイン
更新履歴
c012vu5
2021/04/19 5:52
現在との差分
過去のナレッジの内容
コンテンツ
## 入力 ``` $ cat test.txt hoge hoge hoge hoge hoge hoge MARK hoge hoge hoge ``` ## 全置換 ``` $ sed -i test.txt -e 's/hoge/fuga/g' $ awk -i inplace '{ gsub("hoge", "fuga"); print }' test.txt $ cat test.txt fuga fuga fuga fuga fuga fuga MARK fuga fuga fuga ``` ## 列指定置換 ### 各行で1番目に一致した文字列を置換 ``` $ sed -i test.txt -e 's/hoge/fuga/' $ sed -i test.txt -e 's/hoge/fuga/1' $ awk -i inplace '{ sub("hoge", "fuga", $1); print }' test.txt $ cat test.txt fuga hoge hoge fuga hoge hoge MARK fuga hoge hoge ``` ## 行指定置換 ### 1行目の各列で一致した文字列を置換 ``` $ sed -i test.txt -e '1 s/hoge/fuga/g' $ awk -i inplace '{ if(NR==1){ gsub("hoge", "fuga")}; print }' test.txt $ cat test.txt fuga fuga fuga hoge hoge hoge MARK hoge hoge hoge ``` ## 行列指定置換 ### 2行2列目の文字列が一致したら置換 ``` $ awk -i inplace '{ if(NR==2){ sub("hoge", "fuga", $2) }; print $0 }' test.txt $ cat test.txt hoge hoge hoge hoge fuga hoge MARK hoge hoge hoge ``` ## パターンマッチ ### 検索文字列に一致した各行で1番目に一致した文字列を置換 ``` $ sed -i test.txt -e '/MARK/s/hoge/fuga/' $ awk -i inplace '{ if($0 ~ "MARK"){ sub("hoge", "fuga") }; print }' test.txt $ cat test.txt hoge hoge hoge fuga hoge hoge MARK hoge hoge hoge ``` ### 検索文字列に一致した行のうち、1番目の行で一致した文字列を置換 #### 入力 ``` $ cat longtest.txt hoge hoge hoge hoge hoge hoge hoge hoge hoge hoge MARK hoge hoge hoge hoge hoge hoge hoge hoge hoge hoge MARK hoge hoge hoge hoge hoge ``` #### コマンド `if(c==$NUM)`の`$NUM`でパターンマッチした内の何行目を対象に置換するのか決めている ``` $ sed -i test.txt -e /わからない/ $ awk -i inplace '/MARK/{ c++; if(c==1){ sub("hoge","fuga") }} 1' test.txt $ cat longtest.txt hoge hoge hoge hoge hoge fuga hoge hoge hoge hoge MARK hoge hoge hoge hoge hoge hoge hoge hoge hoge hoge MARK hoge hoge hoge hoge hoge ```
現在のナレッジの内容
コンテンツ
基本的な文字列置換の方法が紹介してあります。 パターンマッチで複数の該当行が出て来た場合に、どの行で置換を行うのか指定する、というのが目標でした。 一番下にコマンドが書いてあります。 また、`sed`での書き方、修正、改善などありましたらコメントお願いします。 ## 入力 ``` $ cat test.txt hoge hoge hoge hoge hoge hoge MARK hoge hoge hoge ``` ## 全置換 ``` $ sed -i test.txt -e 's/hoge/fuga/g' $ awk -i inplace '{ gsub("hoge", "fuga"); print }' test.txt $ cat test.txt fuga fuga fuga fuga fuga fuga MARK fuga fuga fuga ``` ## 列指定置換 ### 各行で1番目に一致した文字列を置換 ``` $ sed -i test.txt -e 's/hoge/fuga/' $ sed -i test.txt -e 's/hoge/fuga/1' $ awk -i inplace '{ sub("hoge", "fuga", $1); print }' test.txt $ cat test.txt fuga hoge hoge fuga hoge hoge MARK fuga hoge hoge ``` ## 行指定置換 ### 1行目の各列で一致した文字列を置換 ``` $ sed -i test.txt -e '1 s/hoge/fuga/g' $ awk -i inplace '{ if(NR==1){ gsub("hoge", "fuga")}; print }' test.txt $ cat test.txt fuga fuga fuga hoge hoge hoge MARK hoge hoge hoge ``` ## 行列指定置換 ### 2行2列目の文字列が一致したら置換 ``` $ awk -i inplace '{ if(NR==2){ sub("hoge", "fuga", $2) }; print $0 }' test.txt $ cat test.txt hoge hoge hoge hoge fuga hoge MARK hoge hoge hoge ``` ## パターンマッチ ### 検索文字列に一致した各行で1番目に一致した文字列を置換 ``` $ sed -i test.txt -e '/MARK/s/hoge/fuga/' $ awk -i inplace '{ if($0 ~ "MARK"){ sub("hoge", "fuga") }; print }' test.txt $ cat test.txt hoge hoge hoge fuga hoge hoge MARK hoge hoge hoge ``` ### 検索文字列に一致した行のうち、1番目の行で一致した文字列を置換 #### 入力 ``` $ cat longtest.txt hoge hoge hoge hoge hoge hoge hoge hoge hoge hoge MARK hoge hoge hoge hoge hoge hoge hoge hoge hoge hoge MARK hoge hoge hoge hoge hoge ``` #### コマンド `if(c==$NUM)`の`$NUM`でパターンマッチした内の何行目を対象に置換するのか決めている ``` $ sed -i longtest.txt -e /わからない/ $ awk -i inplace '/MARK/{ c++; if(c==1){ sub("hoge","fuga") }} 1' longtest.txt $ cat longtest.txt hoge hoge hoge hoge hoge fuga hoge hoge hoge hoge MARK hoge hoge hoge hoge hoge hoge hoge hoge hoge hoge MARK hoge hoge hoge hoge hoge ```
戻る