質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
sed

sedとは、POSIX環境のために作られたコマンドラインエディタです。sedは編集スクリプトの指示のもとに複数のファイルを編集し、標準出力にその結果を出力します。

zsh

zshは、UNIX系OSのシェルの1つです。 cshやksn系のコマンドライン編集機能も実装されたシェルです。

AWK

AWKは、UNIX 上で開発されたプログラミング言語で、CSVファイルなどのテキストファイルの処理を目的にデザインされています。

Q&A

解決済

2回答

827閲覧

sed に行わせたいコマンド文字列を組み立てるとダブルクォーテーションが不明なコマンドとしてエラーが出る。

noc

総合スコア73

sed

sedとは、POSIX環境のために作られたコマンドラインエディタです。sedは編集スクリプトの指示のもとに複数のファイルを編集し、標準出力にその結果を出力します。

zsh

zshは、UNIX系OSのシェルの1つです。 cshやksn系のコマンドライン編集機能も実装されたシェルです。

AWK

AWKは、UNIX 上で開発されたプログラミング言語で、CSVファイルなどのテキストファイルの処理を目的にデザインされています。

0グッド

0クリップ

投稿2022/04/21 17:38

編集2022/04/22 01:57

zshスクリプトにて、最終的に以下のコードを sed -i.bak -e "75,78d" -e "74,74d" -e "67,71d" ~/target のように展開させて対象のファイルの行を削除して保存を行いたいです。

shell

1targetFile=~/target 2arr=($'74:74:baz\nqux' '67:71:quux' $'75:78:foo\nbar') # 各要素の先頭2フィールドが削除する行の指定 3 4# sed に与える -e "1,2d" 形式の引数を得る 5cmds=$( 6 for line in "${arr[@]}"; do # 要素に改行が含まれた配列を要素ごとに処理させるようにする 7 echo "${(q)line}" 8 done | awk -F: '{printf "-e \"%d,%dd\"\n", $1, $2}' | sort -nr 9) 10sed -i.bak "${cmds[@]}" "$targetFile" 11

しかしこのままだと
sed: -e expression #1, char 2: 不明なコマンド: `"'
のようなエラーが出ます。
何がおかしいのでしょうか?
ちなみに降順でソートを行っているのはファイルの後ろの方から削除しないと行がズレると思ったからです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

いろいろおかしいです。
1.変数の中に"を入れても、その文字のままとして扱われる。
2.変数展開してから単語分割するにはZshの場合は${=変数名}と書く必要がある。
3.${(q)line}(q)の意図が不明。
4.引用符で囲むと~がホームディレクトリに展開されない。
など。

Zsh

1targetFile=~/target 2arr=($'74:74:baz\nqux' '67:71:quux' $'75:78:foo\nbar') 3 4cmds=$( 5 for line in "${arr[@]}"; do 6 IFS=: col=(${=line}) 7 echo "-e ${col[1]},${col[2]}d" #オプションで配列添え字を0始まりにしている場合は修正要 8done | sort -nr 9) 10sed -ibak "${=cmds}" "$targetFile"

sort -nrしている意味がわかりませんが、そのままに。

投稿2022/04/21 21:20

otn

総合スコア84491

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

noc

2022/04/22 02:11

`setopt SH_WORD_SPLIT` してるから${=var} は要らないだろうと考えていましたが、実際やってみると `=` が必要でした。どういうことなのかわかりませんが、解決して助かりました。
otn

2022/04/22 02:36

ああ、そういうオプションがデフォルトでない場合は、質問文に書いておきましょう。 その場合は、sh/bashと同じになるはずなので、引用符で囲まなければ分割されると思います。 sh/bashでも引用符で囲むと分割されません。 sed -ibak ${cmds} "$targetFile"
guest

0

最終的に 〜 対象のファイルの行を削除して保存を行いたいです

shell

1#!/bin/zsh 2 3targetFile=~'/target' 4arr=($'74:74:baz\nqux' '67:71:quux' $'75:78:foo\nbar') 5 6arr=("${arr[@]/:/,}") 7sed -i.bak -e "$(echo ${arr[@]/:*/d;})" "$targetFile"

投稿2022/04/22 00:13

melian

総合スコア19701

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

noc

2022/04/22 00:59

これだと配列の最初の要素(index1)以外は使えなくなりませんか?
melian

2022/04/22 01:05

よく分かりませんが、後で $arr を使うのであれば brr=("${arr[@]/:/,}") などとして別変数に入れればよいかと。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問