行番号を含む列を抽出するタブファイルがあり、他のファイルから行を抽出する必要があります。私は行番号を取得してcut -f
変数に保存しましたlist
。私はsed
以下を試してみました。
$ list="2 5 7 10"
$ echo $list
2 5 7 10
$ sed -n "$list p" longText.txt
sed: -e expression #1, char 3: unknown command: `5'
$ sed -n "${list}p" longText.txt
sed: -e expression #1, char 3: unknown command: `5'
エラーは何ですか?正しい構文は何ですか?
答え1
sed
コードの問題は、次のようなものを実行しようとしていることです。
2 5 7 10p
これは明らかに言葉にならないのでsed
文句です。
問題の一部は、単一の文字列を使用してさまざまな項目(行番号)を保持することです。これを行うには、配列を使用するのが最善です。その後、各配列要素(行番号)をp
その後に挿入して別々のコマンドにする必要がありますsed
。
数字2、5、7、10の場合、sed
次のスクリプトが必要です。
2p; 5p; 7p; 10p;
または
2p;5p;7p;10p;
または
2p
5p
7p
10p
次の配列からこれらのスクリプトを簡単に作成できますbash
。
lines=( 2 5 7 10 )
printf '%sp\n' "${lines[@]:-"q;"}" | sed -n -f /dev/stdin longText.txt
printf
これは、数値リストからスクリプトを生成し、それを標準入力から読み取ってファイルに適用するスクリプトに供給するために使用されます。sed
sed
-f /dev/stdin
リストが空の場合は、何もせずに終了するprintf
式がエクスポートされます。sed
sed
もしあなたなら必要文字列の数値を使用するには、その文字列を有効なsed
スクリプトに変換し、次のようにファイルに適用できます。
sed 's/[[:digit:]]\{1,\}/&p;/g' <<<"$list" | sed -n -f /dev/stdin longText.txt
文字列が与えられると、上記と同様にファイルに適用されるスクリプトが2 5 7 10
生成されます。sed
2p; 5p; 7p; 10p;
リストが空の場合はsed
何も出力されません。
答え2
コマンドの前にエコーを追加すると、sed
何が間違っているのか、なぜ発生したのかを確認できます。
エディタを使用する1つの方法sed
は次のとおりです。
# assuming default IFS
## based on Kusalananda's observations
set -f ;# disable globbing
list="2 5 7 10"
for i in $list;do
echo "${i}p"
done | sed -nf - longText.txt
## or per Kusalanda method has a bug in it
## for empty list it generates wrong output
# printf '%sp\n' $list | sed -nf - lonxt.txt