取代該行文字的資料

如果只是單純要取代,去掉一行的資料。可以使用 tr 指令,
這樣就不需要使用 sedawk ,花費許多時間在測試正規表示式。

工作上遇到一個需求,需要取出 node.js 專案中 package.json 裡特定模組的名稱,
這裡把需求改為要知道所有的 babel 模組名稱,利用管線,可以串成一行來得到結果。

底下是簡化版的 package.json 內容,也是要解析的目標。

{
  "name": "project name",
  "version": "1.0.6",
  "main": "index.js",
  "devDependencies": {
    "babel-core": "^6.26.3",
    "babel-loader": "^7.1.5",
    "babel-plugin-istanbul": "^4.1.6",
    "babel-preset-env": "^1.7.0",
    "babel-preset-stage-0": "^6.24.1",
    "browser-sync": "^2.0.0",
    "chai": "^3.5.0",
    "karma": "^1.7.0",
    "karma-chai": "^0.1.0",
    "karma-mocha": "^1.3.0",
    "karma-mocha-reporter": "^2.2.3",
    "karma-sinon": "^1.0.5",
    "karma-webpack": "^2.0.3",
    "mocha": "^3.3.0",
    "webpack": "^4.17.2",
    "webpack-dev-server": "^3.1.7",
  },
  "description": "some project description"
}

首先先定位到目標的那幾行…

cat package.json | grep babel

得到結果。

    "babel-core": "^6.26.3",
    "babel-loader": "^7.1.5",
    "babel-plugin-istanbul": "^4.1.6",
    "babel-preset-env": "^1.7.0",
    "babel-preset-stage-0": "^6.24.1",

再以 : 為分隔字元,取得模組名稱的部分。

# 加上 cut 語法
cat package.json | grep babel | cut -d: -f1

作法可以參考 我的另一篇
可以得到模組名稱,但會包含頭尾的空白與雙引號。

    "babel-core"
    "babel-loader"
    "babel-plugin-istanbul"
    "babel-preset-env"
    "babel-preset-stage-0"

最後,今天的主角要出來了,使用 tr (translate or delete characters) 來去掉不要的部分,
使用 -d 表示要刪除(delete) 字元,再告訴其目標為空白和雙引號。

# 使用單引號,確保 -d 包含空白的值
cat package.json | grep babel | cut -d: -f1 | tr -d ' "'

就得到最終,乾淨的模組名稱了。

babel-core
babel-loader
babel-plugin-istanbul
babel-preset-env
babel-preset-stage-0