Linux 将文件读入保留变量的空格和换行符中
正如问题所暗示的,我打算使用单个变量以原始格式通过bash脚本存储输入 基本上,当出现输入提示时,我会粘贴一些行,然后将存储的变量写入文本文件。经过一段时间的搜索,我发现了readarray,但它并没有将输入/粘贴存储在其原始粘贴状态 为了简单起见,假设我打算存储在变量中的输入/粘贴如下所示:Linux 将文件读入保留变量的空格和换行符中,linux,bash,unix,awk,sed,Linux,Bash,Unix,Awk,Sed,正如问题所暗示的,我打算使用单个变量以原始格式通过bash脚本存储输入 基本上,当出现输入提示时,我会粘贴一些行,然后将存储的变量写入文本文件。经过一段时间的搜索,我发现了readarray,但它并没有将输入/粘贴存储在其原始粘贴状态 为了简单起见,假设我打算存储在变量中的输入/粘贴如下所示: 1 2 3 4 5 预期脚本 #!/bin/bash #the part i need help with ( Store the multiple line input/paste
1
2
3
4
5
预期脚本
#!/bin/bash
#the part i need help with ( Store the multiple line input/paste in raw format in a variable called let say test )
....
echo "$test" > test.txt
cat test.txt
这应该以我在控制台中输入提示时粘贴的格式打印1..5,如上所示
编辑-可能有人想知道我的实际用例是什么,所以我举了一个例子,说明我的粘贴在实际用例中是什么。为了简单起见,我使用了有问题的1..5示例
https://cdn.jwplayer.com/videos/XXXizsW4-32313922.mp4
out=Lecture 01- AS 1 Theory.mp4
https://cdn.jwplayer.com/videos/XXX6XFPB-32313922.mp4
out=Lecture 02- AS 1 Question.mp4
https://cdn.jwplayer.com/videos/XXXIeQNM-32313922.mp4
out=Lecture 03- AS 2 Theory.mp4
我只会以这种格式粘贴文本
https://link
out=Some-Name.mp4 ( 2 spaces before word out )
虽然有300400对这样的线,我会粘贴(如果有关系的话)。沿着这些线:
#!/bin/bash
IFS= read -r -d $'\004' test
echo "$test" > /tmp/test.txt
粘贴输入后按CTRL-D键,检查文件/tmp/test.txt
给定:
$ cat test.txt
1
2
3
4
5
有几种方法:
首先,可以使用进程替换将文件内容读入单个变量:
$ txt="$(cat test.txt)"
$ echo "$txt"
1
2
3
4
5
或者,您可以逐行循环文件内容并保留格式:
$ while IFS= read -r line || [[ -n $line ]]; do printf "'%s'\n" "$line"; done <test.txt
' 1'
' 2'
' 3'
' 4'
' 5'
(从
!(NR%2)
中删除!
,以处理奇数对。)问题显然在于如何编写变量。如果使用数组,则在编写数组时需要正确引用它
readarray-d$'\n“测试
printf'%s\n'${test[@]}
如果这还不是你所需要的全部,那么请发布一个新问题:
$ foo=$(< file)
$ printf '%s\n' "$foo"
1
2
3
4
5
$foo=$(
define:“readarray,但它不适合我的需要”它不是以原始格式存储我的粘贴在变量中“原始格式”是什么意思?您能否以明确的形式提供输入和预期输出的示例(如果需要包含控制代码或其他不可打印字符,可能是十六进制转储或$'C-style string\n'
)?按原始格式,我的意思是它应该准确存储在输入提示期间粘贴的内容。它应该保留所有缩进和缩进spaces@tripleee好了,我还添加了我的实际用例场景。我希望现在一切都清楚了,这是不对的$lines
不是数组,只是它的第一个元素。我看不出我的帖子和你的(@tripleee)有什么区别。两者都以相同的方式读取数据,因此在您的情况下,数据也(仅)在第一个元素中?好的,但我在readarray-d'\n'行中没有“$”。演示:那么为什么要使用阵列呢read-r-d'no-this separator no-sirree'行
就不会那么混乱了。(仍然需要引用变量youecho
)演示:仍然“我想要一个数组,但数组没有任何有用的功能”是一个令人费解的解释。
$ echo "https://cdn.jwplayer.com/videos/XXXizsW4-32313922.mp4
out=Lecture 01- AS 1 Theory.mp4
https://cdn.jwplayer.com/videos/XXX6XFPB-32313922.mp4
out=Lecture 02- AS 1 Question.mp4
https://cdn.jwplayer.com/videos/XXXIeQNM-32313922.mp4
out=Lecture 03- AS 2 Theory.mp4" | awk '!(NR%2){sub(/mp4/,"MP4 EVEN LINE")}1'
https://cdn.jwplayer.com/videos/XXXizsW4-32313922.mp4
out=Lecture 01- AS 1 Theory.MP4 EVEN LINE
https://cdn.jwplayer.com/videos/XXX6XFPB-32313922.mp4
out=Lecture 02- AS 1 Question.MP4 EVEN LINE
https://cdn.jwplayer.com/videos/XXXIeQNM-32313922.mp4
out=Lecture 03- AS 2 Theory.MP4 EVEN LINE
$ foo=$(< file)
$ printf '%s\n' "$foo"
1
2
3
4
5