Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 将文件读入保留变量的空格和换行符中_Linux_Bash_Unix_Awk_Sed - Fatal编程技术网

Linux 将文件读入保留变量的空格和换行符中

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

正如问题所暗示的,我打算使用单个变量以原始格式通过bash脚本存储输入

基本上,当出现输入提示时,我会粘贴一些行,然后将存储的变量写入文本文件。经过一段时间的搜索,我发现了readarray,但它并没有将输入/粘贴存储在其原始粘贴状态

为了简单起见,假设我打算存储在变量中的输入/粘贴如下所示:

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'行
就不会那么混乱了。(仍然需要引用变量you
echo
)演示:仍然“我想要一个数组,但数组没有任何有用的功能”是一个令人费解的解释。
$ 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